本文将带你详细了解Docker环境部署入门的相关知识,从基础概念到安装步骤,帮助新手快速上手。你还将学习如何操作Docker镜像和容器,包括获取、构建和管理镜像,启动和运行容器等。此外,文章还会介绍Docker网络与存储的基本概念和实战案例,帮助你掌握Docker环境部署入门所需的所有技能。Docker环境部署入门过程中涉及的所有关键步骤和概念都将在文中详细讲解。
Docker是一种开源的容器化技术,它允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,以便在任何支持Docker的操作系统上运行。容器是运行在操作系统级别的一种轻量级虚拟化技术,与传统的虚拟机相比,容器可以更快速地启动和关闭,资源占用更少。
Docker通过运行在宿主机上的Docker引擎,使用Linux内核提供的命名空间和控制组等特性,实现了容器的隔离和资源限制。Docker镜像是只读的,容器是基于镜像创建的可写层,这样可以实现镜像的复用和版本控制。Docker容器的创建过程包括读取镜像、创建可写层、分配资源和启动容器等步骤。容器运行时,Docker引擎会通过命名空间和控制组来管理容器的网络、进程和文件系统等资源。
Docker 提供了两个主要版本:Docker CE(社区版)和 Docker EE(企业版)。对于新手来说,建议使用 Docker CE。Docker CE 是一个免费的版本,适用于开发和测试环境。它包含了 Docker 的核心功能和社区支持。
Docker EE 则是为生产环境而设计的,提供了更高级的功能和企业级的支持。
在Ubuntu上安装Docker可以使用APT包管理器,以下是安装步骤:
更新APT包管理器:
sudo apt-get update
安装必要的软件包以允许APT通过HTTPS使用存储库:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
添加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加D Dormer的APT存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
更新APT包索引:
sudo apt-get update
安装Docker:
sudo apt-get install docker-ce
sudo docker --version
在CentOS上安装Docker可以使用yum包管理器,以下是安装步骤:
更新yum包管理器:
sudo yum update
安装必要的软件包以允许yum使用HTTPS存储库:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加Docker的存储库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker:
sudo yum install docker-ce
启动Docker服务:
sudo systemctl start docker
docker --version
安装完成后,可以通过运行以下命令来验证Docker是否正确安装:
docker --version
输出类似以下信息表示安装成功:
Docker version 20.10.0, build <hash>
要获取Docker镜像,可以使用docker pull
命令。例如,要获取官方的Nginx镜像,可以运行:
docker pull nginx
这将会从Docker Hub上下载最新的官方Nginx镜像。
通过编写Dockerfile来定义镜像的构建过程。Dockerfile是一个文本文件,其中包含了构建镜像所需的所有指令。以下是一个简单的Dockerfile示例,用于构建一个运行Hello World的镜像:
# 使用官方的Ubuntu镜像作为基础镜像 FROM ubuntu:latest # 设置环境变量 ENV NAME World # 添加运行Hello World的命令 RUN apt-get update && apt-get install -y \ python3 \ && rm -rf /var/lib/apt/lists/* # 暴露端口 EXPOSE 80 # 设置工作目录 WORKDIR /app # 将应用程序的源代码复制到镜像中 COPY . /app # 设置容器启动时要运行的命令 CMD ["python3", "app.py"]
构建镜像并标记为my-helloworld
:
docker build -t my-helloworld .
可以使用docker images
命令列出本地的镜像:
docker images
这将输出以下类似的列表:
REPOSITORY TAG IMAGE ID CREATED SIZE my-helloworld latest e9b027c0d1d6 3 hours ago 1.1GB nginx latest 24c0a66c924f 2 weeks ago 135MB
使用docker rmi
命令删除本地镜像:
docker rmi my-helloworld
可以使用docker run
命令启动一个容器。例如,启动一个Nginx容器并设置暴露80端口:
docker run -d -p 8080:80 nginx
这将启动一个后台运行的Nginx容器,并将容器的80端口映射到主机的8080端口。
要进入一个正在运行的容器,可以使用docker exec
命令。例如:
docker exec -it <container_id> /bin/bash
这将打开一个交互式的bash shell到指定的容器中。可以通过docker ps
命令获取容器ID。
要停止一个正在运行的容器,可以使用docker stop
命令:
docker stop <container_id>
要删除一个容器,可以使用docker rm
命令:
docker rm <container_id>
Docker提供了多种网络模式,包括桥接网络(bridge)、主机网络(host)、容器网络(container)和自定义网络(custom networks)。默认情况下,容器使用桥接网络。
可以使用docker network
命令来创建自定义网络。例如,创建一个名为my_network
的网络:
docker network create my_network
可以使用--network
选项将容器连接到自定义网络。例如,启动一个容器并连接到my_network
:
docker run -d --name my_container --network my_network nginx
容器之间的网络通信可以通过配置容器的网络模式来实现。当容器连接到同一个自定义网络时,它们可以通过容器名来互相通信。
例如,假设我们有两个容器,它们连接到同一个自定义网络my_network
,容器名为container1
和container2
。在container1
中,可以通过container2
的容器名访问container2
的服务。
Docker卷可以用于持久化容器的数据。卷可以在容器之间共享数据,或者用于持久化存储。使用docker volume
命令来管理卷。
创建一个新的卷:
docker volume create my_volume
在启动容器时,可以将卷挂载到容器的某个目录。例如,将my_volume
挂载到容器的/data
目录:
docker run -d --name my_container -v my_volume:/data nginx
假设我们有一个简单的Web应用,使用Python Flask框架编写。应用代码如下:
# app.py from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=80)
# 使用官方的Python镜像作为基础镜像 FROM python:3.8-alpine # 设置工作目录 WORKDIR /app # 复制应用代码到镜像中 COPY requirements.txt requirements.txt COPY app.py app.py # 安装应用依赖 RUN pip install -r requirements.txt # 暴露端口 EXPOSE 80 # 设置容器启动时要运行的命令 CMD ["python3", "app.py"]
requirements.txt
文件,包含应用依赖:```requirements.txt
Flask==1.1.2
3. 构建Docker镜像: ```sh docker build -t my-flask-app .
docker run -d -p 8080:80 my-flask-app
docker ps
命令查看正在运行的容器:docker ps
打开浏览器,访问http://localhost:8080
,你应该能看到输出Hello, World!
。