本文详细介绍了Docker部署实战的全过程,从Docker的基础概念到环境搭建,再到镜像操作、容器管理以及网络与存储的配置。通过一系列实战案例,帮助读者掌握如何使用Docker部署一个简单的Web应用。Docker部署实战不仅简化了应用的部署过程,还提高了应用的一致性和稳定性。
Docker基础概念介绍什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包应用及其依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的主要组成部分
Docker 主要由以下几个部分组成:
- 镜像(Image):镜像是一个只读模板,包含了创建一个容器所需的文件系统。镜像是构建容器的基础。
- 容器(Container):容器是镜像的运行实例。可以启动、停止、删除一个或多个容器。容器运行起来后,用户可以通过容器对应用进行配置、运行等操作。
- 仓库(Registry):仓库分为公共仓库(如 Docker Hub)和私有仓库。仓库是管理Docker镜像的,可以上传、下载、分享不同的镜像。
- Docker Daemon:Docker Daemon 是Docker服务端的主要进程,负责接收客户端发送的指令,管理镜像的生命周期、创建、运行、分发容器。
为什么选择Docker进行部署
Docker 的主要优势包括:
- 轻量级:Docker容器相比于虚拟机更轻量,启动速度更快,占用资源更少。
- 易于移植:Docker允许应用跨平台、跨主机的移植,保证了应用的一致性。
- 简化部署:通过使用Dockerfile可以自动化构建容器,大大简化部署过程。
- 隔离性:通过Docker的沙箱机制,不同应用之间相互隔离,大大提高了应用的稳定性。
在Linux系统中安装Docker
- 添加Docker的APT仓库:
sudo apt-get update
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 -
- 设置Docker仓库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 安装Docker:
sudo apt-get update
sudo apt-get install docker-ce
- 验证Docker是否安装成功:
sudo docker --version
在Windows和macOS系统中安装Docker
- 访问Docker官方网站,下载适用于Windows或macOS的Docker Desktop安装包。
- 运行安装包,根据提示完成Docker的安装。
- 打开Docker Desktop应用,确保Docker服务已启动。
在命令行中验证Docker是否安装成功:
docker --version
输出结果如下:
Docker version 20.10.7, build f0df351
Docker镜像操作
搜索和下载Docker镜像
- 搜索镜像:
docker search nginx
输出如下:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official Docker Hub Nginx base image 18724 [OK]
- 下载镜像:
docker pull nginx
输出如下:
Using default tag: latest
latest: Pulling from library/nginx
...
从其他仓库下载Docker镜像
假设我们从另一个公共仓库下载镜像,例如自定义的仓库:
docker pull customregistry/nginx:latest
构建自己的Docker镜像
- 创建一个Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
- 构建镜像:
docker build -t my-nginx .
输出如下:
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM ubuntu:latest
Step 2/4 : RUN apt-get update && apt-get install -y nginx
...
Successfully built 1234567890abcdef
Successfully tagged my-nginx:latest
- 验证镜像是否构建成功:
docker images
输出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx latest 1234567890 2 hours ago 187MB
管理本地镜像
- 列出所有镜像:
docker images
- 删除镜像(以示例镜像为例):
docker rmi my-nginx
输出如下:
Untagged: my-nginx:latest
Untagged: 1234567890abcdef
Deleted: 1234567890abcdef
Docker容器管理
创建和启动容器
- 创建并启动容器:
docker run -d -p 8080:80 --name my-nginx-container my-nginx
输出如下:
9876543210abcdef
- 查看运行中的容器:
docker ps
输出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9876543210 my-nginx "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp my-nginx-container
批量管理容器
假设我们要使用Docker Compose批量管理容器,我们首先创建一个docker-compose.yml
文件:
version: '3'
services:
web:
image: my-nginx
ports:
- "8080:80"
networks:
- my-network
db:
image: mariadb
networks:
- my-network
networks:
my-network:
driver: bridge
然后运行以下命令:
docker-compose up -d
这将启动两个容器,并将它们连接到同一个网络。
进入容器内部
- 进入容器:
docker exec -it my-nginx-container /bin/bash
输出如下:
root@9876543210abcdef:/#
停止和删除容器
- 停止容器:
docker stop my-nginx-container
输出如下:
my-nginx-container
- 删除容器:
docker rm my-nginx-container
输出如下:
my-nginx-container
Docker网络与存储
理解Docker的网络模式
Docker支持几种不同的网络模式:
- Bridge:默认模式,容器连接到一个虚拟网桥上。
- Host:容器直接使用主机的网络栈。
- None:容器不连接任何网络。
- Container:连接到另一个容器的网络栈。
为容器配置自定义网络
- 创建自定义网络:
docker network create my-network
输出如下:
43210abcdef123
- 使用自定义网络启动容器:
docker run -d --name my-nginx-container --network my-network my-nginx
输出如下:
9876543210abcdef
- 查看容器连接到的网络:
docker inspect my-nginx-container
输出如下:
...
"NetworkSettings": {
...
"Networks": {
"my-network": {
"IPAMConfig": {},
"Links": {},
"NetworkID": "43210abcdef123",
"EndpointID": "abcdef1234567890",
"Gateway": "192.168.1.1",
"IPAddress": "192.168.1.2",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:c0:a8:01:02"
}
}
}
使用Docker卷管理数据
- 创建Docker卷:
docker volume create my-volume
输出如下:
my-volume
- 使用Docker卷启动容器:
docker run -d --name my-nginx-container -v my-volume:/var/www/html my-nginx
输出如下:
9876543210abcdef
- 查看容器挂载的卷:
docker inspect my-nginx-container
输出如下:
...
"Mounts": [
{
"Type": "volume",
"Name": "my-volume",
"Source": "/var/lib/docker/volumes/my-volume/_data",
"Destination": "/var/www/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
实战案例:部署一个简单的Web应用
准备Web应用代码
- 创建一个简单的HTML文件:
<!DOCTYPE html>
<html>
<head>
<title>My Docker App</title>
</head>
<body>
<h1>Hello, Docker!</h1>
</body>
</html>
创建Dockerfile
- 创建Dockerfile:
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
- 构建镜像:
docker build -t my-web-app .
输出如下:
Sending build context to Docker daemon 53 bytes
Step 1/2 : FROM nginx:latest
Step 2/2 : COPY index.html /usr/share/nginx/html/
...
Successfully built 1234567890abcdef
Successfully tagged my-web-app:latest
构建并运行容器
- 启动容器:
docker run -d -p 8080:80 --name my-web-app-container my-web-app
输出如下:
9876543210abcdef
- 访问Web应用:
在浏览器中打开 http://localhost:8080
,可以看到 "Hello, Docker!" 的页面。
- 查看容器日志:
docker logs my-web-app-container
输出如下:
...
172.17.0.1 - - [01/Jan/1970:00:00:00 +0000] "GET / HTTP/1.1" 200 24 "-" "-"
- 进入容器内部:
docker exec -it my-web-app-container /bin/bash
输出如下:
root@9876543210abcdef:/# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>My Docker App</title>
</head>
<body>
<h1>Hello, Docker!</h1>
</body>
</html>
- 停止并删除容器:
docker stop my-web-app-container
docker rm my-web-app-container
输出如下:
my-web-app-container
my-web-app-container
通过以上步骤,你已经成功地使用Docker部署了一个简单的Web应用。这展示了Docker的强大功能,可以快速构建、部署和管理应用。
从Docker Hub下载现有Web应用镜像并部署
假设我们要从Docker Hub下载一个现有的Web应用镜像并部署,以 nginx
为例:
docker pull nginx
docker run -d -p 8080:80 --name my-nginx-container nginx
输出如下:
9876543210abcdef
这将下载 nginx
镜像并启动一个新的容器,访问 http://localhost:8080
可以看到默认的Nginx页面。
共同学习,写下你的评论
评论加载中...
作者其他优质文章