Docker容器化部署是一种将应用及其依赖打包成独立可移植容器的方法,确保应用在不同环境中的运行一致性。本文详细介绍了Docker的安装、基本概念与命令行操作,以及如何通过Docker Compose进行多容器部署。此外,还介绍了容器网络与端口映射、持久化存储等相关内容,并通过具体实例全面展示了Docker容器化部署的实际应用。
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包成一个可移植、自给自足的容器。开发者可以在该容器中编写并运行任何应用程序,而不会受到外部环境的影响。Docker 使用客户端-服务器架构,主要由 Docker 守护进程(docker
)、Docker 镜像(Image
)、Docker 容器(Container
)和 Docker 仓库(Registry
)组成。
Docker 镜像是一个只读的模板,它定义了容器运行时的环境,包括文件系统、环境变量、执行命令等。Docker 容器是镜像的运行实例,它可以被启动、停止、删除。Docker 仓库是存放 Docker 镜像的地方,可以公开或私有。Docker 守护进程负责管理镜像和容器的创建、启动、停止等操作。
安装 Docker 可以根据不同的操作系统进行选择,以下是详细步骤:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
安装完成后,可以通过运行以下命令来验证 Docker 是否安装成功:
docker --version
如果安装成功,会显示 Docker 版本信息。例如:
Docker version 20.10.7, build f0df351
Docker 镜像是一个只读模板,它包含了构建容器所需的所有内容:应用程序代码、运行时环境、库、环境变量、配置文件等。镜像是经过一次或多次增量文件系统修改的只读层的组合。Docker 镜像可以通过 docker pull
命令从 Docker 仓库中拉取,也可以通过 docker build
命令自己构建。
Docker 容器是一个可执行的独立软件包,它包含了运行应用程序的代码及其依赖。容器是镜像的运行实例,它可以通过 docker run
命令创建。容器从镜像启动时,会继承镜像中的所有层,并在镜像的顶部添加一个可写层。容器是轻量级的,可以快速启动、停止、删除。
Docker 仓库是存放镜像的仓库,可以公开或私有。Docker Hub 是 Docker 官方的公共仓库,用户可以上传自己的镜像到 Docker Hub,并从 Docker Hub 拉取其他用户的镜像。Docker 仓库也可以自己搭建,例如使用 Docker Registry 或 Harbor。
使用 docker pull
命令可以从 Docker 仓库中拉取镜像。例如,可以通过以下命令拉取官方的 Nginx 镜像:
docker pull nginx
使用 docker build
命令可以根据 Dockerfile 构建镜像。Dockerfile 是一个文本文件,它包含了构建镜像的指令。例如,可以在当前目录下创建一个 Dockerfile,内容如下:
FROM nginx:latest COPY ./html /usr/share/nginx/html
然后可以通过以下命令构建镜像:
docker build -t my-nginx .
使用 docker rmi
命令可以删除本地的镜像。例如,可以通过以下命令删除名为 my-nginx
的镜像:
docker rmi my-nginx
使用 docker run
命令可以启动容器。例如,可以通过以下命令启动 Nginx 容器:
docker run -d --name my-nginx -p 8080:80 nginx
该命令会下载 Nginx 镜像(如果本地没有),然后启动一个 Nginx 容器,容器名称为 my-nginx
,端口 80 映射到主机的 8080 端口。
使用 docker stop
命令可以停止容器。例如,可以通过以下命令停止名为 my-nginx
的容器:
docker stop my-nginx
使用 docker rm
命令可以删除容器。例如,可以通过以下命令删除名为 my-nginx
的容器:
docker rm my-nginx
Dockerfile 是一个文本文件,它包含了构建镜像的指令。Dockerfile 的语法简单,主要包括以下几个指令:
FROM
:指定基础镜像RUN
:执行命令,构建镜像时执行CMD
:指定容器启动时运行的命令EXPOSE
:暴露端口COPY
:从构建上下文文件系统中复制文件到镜像ENTRYPOINT
:指定容器启动时运行的命令,与 CMD 不同,不会被 CMD 覆盖例如,以下是一个简单的 Dockerfile,用于构建一个包含 nginx 服务器的镜像:
# 使用官方的 nginx 镜像作为父镜像 FROM nginx:latest # 将本地文件夹的文件复制到容器的指定位置 COPY ./html /usr/share/nginx/html # 设置环境变量 ENV NAME World # 暴露容器运行时的端口 EXPOSE 80 # 设置容器启动时运行的命令 CMD ["nginx", "-g", "daemon off;"]
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个名为 docker-compose.yml
的文件来定义应用的服务、网络和卷等配置。以下是一个简单的 docker-compose.yml
文件,用于定义一个包含 Nginx 和 MySQL 的应用:
version: '3' services: web: image: nginx:latest ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: testdb MYSQL_USER: testuser MYSQL_PASSWORD: testpassword volumes: - db_data:/var/lib/mysql volumes: db_data:
可以通过 docker-compose up
命令来启动应用:
docker-compose up
Docker 提供了多种网络模式,包括桥接网络(bridge)、主机模式(host)、容器模式(container)、无网络模式(none)等。其中最常用的是桥接网络(bridge)模式,它默认创建了一个 Docker 内部的虚拟网络,容器可以通过这个网络进行通信。
通过 docker run
命令可以设置端口映射。例如,可以通过以下命令将容器的 80 端口映射到主机的 8080 端口:
docker run -d --name my-nginx -p 8080:80 nginx
Docker 提供了多种持久化存储方式,常用的包括数据卷(volume)、数据卷容器(volume container)等。数据卷是一个位于宿主机上的具有特殊功能的目录,它可以在容器之间共享和重用。数据卷的生命周期独立于容器,当容器被删除时,数据卷不会被自动删除。
通过 -v
参数可以将宿主机的目录挂载到容器中。例如,可以通过以下命令将宿主机的 /data
目录挂载到容器的 /data
目录:
docker run -d --name my-nginx -v /data:/data nginx
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个名为 docker-compose.yml
的文件来定义应用的服务、网络和卷等配置。以下是一个完整的 docker-compose.yml
文件,用于定义一个包含前端和后端应用的多容器应用实例:
version: '3' services: backend: build: ./backend ports: - "3000:3000" volumes: - ./backend:/app environment: - NODE_ENV=production frontend: build: ./frontend ports: - "8080:80" volumes: - ./frontend/dist:/usr/share/nginx/html depends_on: - backend
可以通过 docker-compose up
命令来启动应用:
docker-compose up
以下是一个简单的 Dockerfile,用于构建一个包含 Nginx 服务器的镜像:
FROM nginx:latest COPY ./html /usr/share/nginx/html
可以通过以下命令构建镜像:
docker build -t my-nginx .
可以通过以下命令启动容器:
docker run -d --name my-nginx -p 8080:80 my-nginx
可以通过浏览器访问 http://localhost:8080
来访问 Nginx 服务器。
以下是一个简单的 Dockerfile,用于构建一个包含 MySQL 服务器的镜像:
FROM mysql:latest COPY ./data /var/lib/mysql
可以通过以下命令构建镜像:
docker build -t my-mysql .
可以通过以下命令启动容器:
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testpassword my-mysql
可以通过 MySQL 客户端连接到数据库:
mysql -h 127.0.0.1 -P 3306 -u testuser -p
以下是一个简单的 Dockerfile,用于构建一个包含前端应用的镜像:
FROM nginx:latest COPY ./dist /usr/share/nginx/html
可以通过以下命令构建镜像:
docker build -t my-frontend .
可以通过以下命令启动容器:
docker run -d --name my-frontend -p 8080:80 my-frontend
可以通过浏览器访问 http://localhost:8080
来访问前端应用。
以下是一个简单的 Dockerfile,用于构建一个包含后端应用的镜像:
FROM node:latest WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build CMD ["node", "server.js"]
可以通过以下命令构建镜像:
docker build -t my-backend .
可以通过以下命令启动容器:
docker run -d --name my-backend -p 3000:3000 my-backend
可以通过浏览器访问 http://localhost:3000
来访问后端应用。
以下是一个简单的 docker-compose.yml
文件,用于定义一个包含后端和前端应用的多容器应用:
version: '3' services: backend: build: ./backend ports: - "3000:3000" volumes: - ./backend:/app environment: - NODE_ENV=production frontend: build: ./frontend ports: - "8080:80" volumes: - ./frontend/dist:/usr/share/nginx/html depends_on: - backend
可以通过 docker-compose up
命令来启动应用:
docker-compose up
Docker Registry 是一个开源的私有 Docker 镜像仓库,它可以在本地或远程部署。以下是如何在本地搭建一个私有仓库的步骤:
docker run -d -p 5000:5000 --name registry registry:2
docker build -t localhost:5000/my-nginx . docker push localhost:5000/my-nginx
docker pull localhost:5000/my-nginx
访问 Docker Hub 官网 https://hub.docker.com/,点击注册按钮,填写相关信息,完成注册。
docker build -t username/my-nginx .
docker login
docker push username/my-nginx
docker pull username/my-nginx
docker tag my-nginx:latest username/my-nginx:1.0
docker images
docker rmi username/my-nginx:1.0
docker history my-nginx
Docker Swarm 是 Docker 的原生集群管理工具,它将多个 Docker 主机组合成一个虚拟的 Docker 主机。以下是如何部署 Docker Swarm 集群的步骤:
docker swarm init
docker node ls
docker swarm join --token <token> <manager-ip>:2377
docker service create --name my-nginx --replicas 3 -p 8080:80 nginx
docker service ls
Docker Stack 是一个用于定义和运行多容器应用的工具,它可以将多个服务组合成一个应用,并部署到 Docker Swarm 集群。以下是如何使用 Docker Stack 部署应用的步骤:
docker-compose.yml
文件,定义应用的服务、网络和卷等配置。version: '3.7' services: web: image: nginx:latest ports: - "8080:80" db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: testdb MYSQL_USER: testuser MYSQL_PASSWORD: testpassword
docker stack deploy
命令部署应用:docker stack deploy -c docker-compose.yml my-app
docker stack ps my-app
可以通过 docker run
命令设置环境变量:
docker run -d --name my-nginx -e ENV_VAR=value nginx
或者在 Dockerfile
中设置环境变量:
ENV ENV_VAR value
可以通过 docker run
命令挂载配置文件:
docker run -d --name my-nginx -v /path/to/config:/etc/nginx/conf.d my-nginx
或者在 Dockerfile
中设置配置文件:
COPY ./config /etc/nginx/conf.d
可以通过 docker exec
命令动态修改配置文件:
docker exec -it my-nginx bash
然后在容器中修改配置文件:
vi /etc/nginx/conf.d/default.conf
或者使用 docker-compose.yml
文件定义配置文件:
version: '3' services: web: image: nginx:latest volumes: - ./config:/etc/nginx/conf.d