抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Docker 是一个用Go语言实现的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后运行到任何安装了 docker 的服务器上,达到一次构建,多次复用。

一、安装

1. 软件安装

Windows 和 MacOS 分别前往Docker Desktop for WindowsDocker Desktop for Mac下载安装。

Linux 系统使用官方的一键安装命令

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

若非root用户,可执行命令将当前用户加入 docker 组,而后重新登录ssh即可

1
sudo usermod -aG docker ${USER}

2. 配置国内源

桌面版打开设置面板-Docker Engine进行设置保存,linux下编辑/etc/docker/daemon.json文件保存并重启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"log-driver":"json-file",
"log-opts":{
"max-size":"500m",
"max-file":"3",
"labels":"production_status,geo",
"env":"os,customer"
},
"registry-mirrors":[
"https://dhub.kubesre.xyz",
"https://docker.chenby.cn",
"https://docker.1panel.live",
"https://docker.anyhub.us.kg",
"https://dockerpull.com",
"https://hub.rat.dev",
"https://docker.m.daocloud.io"
],
"dns":[
"8.8.8.8",
"8.8.4.4",
"1.1.1.1",
"223.5.5.5"
]
}

3. 配置代理

由于不可抗力,有时国内源无法使用,此时就需要为docker配置代理。

在执行 docker pull 时守护进程dockerd来执行,因此代理需要配在dockerd的环境中。

1
2
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/proxy.conf

并填入以下内容,其中 192.168.1.1:7890 请替换为你自己的代理。

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://192.168.1.1:7890/"
Environment="HTTPS_PROXY=http://192.168.1.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

而后重启即可

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

二、镜像

镜像对于docker来说有点类似于windows的exe文件或mac的app应用程序,将程序执行环境都打包成了镜像,当需要运行时,只需要将镜像放于任意需要运行的服务器上运行即可

1. 查看镜像

1
2
3
4
5
6
7
8
9
10
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6b3e1257976b 4 weeks ago 135MB
postgres 15-alpine bf01f8da1bd2 4 weeks ago 209MB
alpine/git latest 8bfbb50cd816 2 months ago 43.4MB
drone/drone 2 e6683445823e 2 months ago 57.8MB
golang 1.18 a38580f4a026 3 months ago 819MB
alpine 3 a6215f271958 4 months ago 5.29MB
rabbitmq 3.9.14-management 455611f61a5a 8 months ago 221MB
seepine/alpine jdk8-full 516e63be9a59 12 months ago 112MB

2. 删除镜像

删除可根据名称:版本号或镜像id删除

1
2
docker rmi nginx:latest
docker rmi 6b3e1257976b

3. 查找镜像

查询有哪些可用镜像可执行查询命令,该命令会查询docker公共仓库

1
docker search nginx

或前往dockerHub直接搜索

4. 镜像仓库

除了docker的公共仓库外,我们还可以搭建私有仓库,或使用阿里云等其他服务提供的镜像仓库,非公共仓库与公共仓库从镜像名很容易就能看出区别,例如

镜像名 仓库地址 所属用户 镜像 标签/版本号
nginx docker.io 官方 nginx latest
nacos/nacos-server:v2.1.2 docker.io nacos nacos-server v2.1.2
seepine/alpine:openjdk8 docker.io seepine alpine openjdk8
registry.cn-hangzhou.aliyuncs.com/seepine/mysql:8.0 registry.cn-hangzhou.aliyuncs.com seepine mysql 8.0

5. 拉取镜像

拉取镜像不指定版本时,默认拉取nginx:latest,也可手动指定镜像版本号

1
2
3
docker pull nginx
docker pull nginx:1.18.0
docker pull seepine/alpine:openjdk8

6. 构建镜像

当我们需要的镜像别人未提供,或我们需要定制镜像时,就需要编写 Dockerfile 手动构建镜像。
SpringBoot为例构建为镜像,在项目根目录中准备 Dockerfile 文件并编写如下内容

  • 表示基于 seepine/alpine:openjdk8 镜像
  • 在此基础上创建工作目录 workspace
  • 并将本地打包后的 jar 包拷贝到镜像中为 /workspace/application.jar
  • 最终执行命令 java -jar application.jar 启动应用
1
2
3
4
FROM docker.io/seepine/alpine:openjdk8
WORKDIR workspace
COPY build/libs/*.jar /workspace/application.jar
ENTRYPOINT java -jar application.jar

此时在终端中执行jar构建出需要的jar包后

1
./gradlew bootJar

再执行构建镜像命令即可构建出镜像 seepine/springboot-test:v1.0

1
docker build -t seepine/springboot-test:v1.0 .

关于 Dockerfile 更多规则可查看官方文档DockerfileDoc

7. 推送镜像

镜像构建后只存在于你本地,需要将镜像推送到镜像仓库中,其他服务器上才能拉取得到你构建的镜像 ,推送到镜像仓库根据你构建时镜像名称,并且推送前需要先执行docker logindocker login registry.cn-hangzhou.aliyuncs.com进行登录,否则会无推送权限

1
docker push seepine/springboot-test:v1.0

三、容器

镜像运行之后就会变为容器,因此可知,同一个镜像是可以运行多次,变为多个容器,并且每个容器直接默认都是相互隔离的,有独立的环境、独立的ip、独立的端口等

1. 查看容器

1
2
3
4
5
6
7
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d982f6a2b634 nginx "/docker-entrypoint.…" 23 hours ago Up 23 hours 80/tcp nginx
67e0d3f57766 postgres:15 "docker-entrypoint.s…" 2 days ago Up 2 days 5432/tcp postgresSQL
5a8d39813a2f mysql/mysql-server:8.0.27 "/entrypoint.sh --de…" 2 days ago Up 2 days (healthy) 3306/tcp, 33060-33061/tcp mysql_mysql-slave
134541494b44 mysql/mysql-server:8.0.27 "/entrypoint.sh --de…" 2 days ago Up 2 days (healthy) 3306/tcp, 33060-33061/tcp mysql_mysql-master
c01701b64b4b portainer/portainer "/portainer -H unix:…" 2 days ago Up 2 days 9000/tcp ptr

2. 运行容器

执行以下命令即可运行一个容器(当镜像不存在时会自动拉取镜像),并可看到运行日志,但此时我们无法访问,因为容器是独立的

1
docker run nginx

通过 -p 参数将容器的端口映射到本机端口,此时通过本机ip:port即可访问到容器

1
docker run -p 8080:8080 nginx

3. 进入容器

有时我们不仅仅需要运行容器,还需要进入容器内修改某些文件,可使用命令进入到容器内部

1
docker exec -it c01701b64b4b sh

4. 挂载目录

我们运行的容器都是一次性的,即当我们进入容器内修改了文件后,当容器重启后,一切文件将会复原到容器镜像最初的样子,因此我们可以使用 -v 将容器内某些目录挂载出来,实现持久化。

例如以下命令,表示将容器的 /usr/share/nginx/html 目录,挂载到本机的 /root/data 目录,此时不需要进入到容器内,直接修改本机的 /root/data 目录中的文件即可生效,并且容器重启后文件依然存在。

1
docker run -p 8080:8080 -v /root/data:/usr/share/nginx/html nginx

当然若我们需要持久话,但又不想手动去选择挂载到本机的哪个目录,可以借助 docker volume ,即将本机目录替换为任意名词,docker 会自动帮我们创建 volume 进行保存,更多信息可查看官方文档 DockerVolumesDoc

1
docker run -p 8080:8080 -v nginx-data:/usr/share/nginx/html nginx

5. 停止容器

容器停止后需要使用 docker ps -a 才能查询到

1
docker stop c01701b64b4b

6. 删除容器

1
docker rm c01701b64b4b

四、DockerCompose

当运行容器增多时,一个个容器运行明显麻烦且效率低,此时可借助docker compose进行容器编排

本节内容繁多只顺便一提,需要深入了解和查看官方文档

1. 准备docker-compse.yml文件

表示会启动三个nginx服务,分别映射到端口808080818082,并挂载卷 nginx-data,更多编写规则可查询官方文档ComposeFileDoc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
nginx:
image: nginx
ports:
- "8080:8080"
volumes:
- nginx-data:/usr/share/nginx/html

nginx1:
image: nginx
ports:
- "8081:8080"
volumes:
- nginx-data:/usr/share/nginx/html

nginx2:
image: nginx
ports:
- "8082:8080"
volumes:
- nginx-data:/usr/share/nginx/html

volumes:
nginx-data:

2. 启动

1
docker-compose up

3. 停止

1
docker-compose down

五、DockerSwarm

Docker compose解决了容器编排问题,而当服务器众多,我们仍然需要到每台服务器上去运行,还需要规划每台服务器内存多大,需要部署哪些应用。该场景下,可通过DockerSwarm将所有服务器的docker连结在一起,我们只需要在管理服务器上进行容器编排,docker会自动平衡服务器资源,将容器自动分配到每台服务器上去运行

本节内容繁多只顺便一提,需要深入了解和查看官方文档

1. 创建swarm集群

在管理服务器(也称管理节点)执行初始化

1
2
3
4
5
6
7
8
9
10
$ docker swarm init

Swarm initialized: current node (z2n633mty5py7u9wyl423qnq0) is now a manager.

To add a worker to this swarm, run the following command:

# 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.10.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2. 加入集群

在子服务器(也称工作节点)执行管理节点初始化时生成的加入指令

1
docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.1.100:2377

此时在管理节点执行以下指令即可查看到工作节点已加入

1
docker node ls

3. 容器操作

  • 使用 docker service create 代替 docker run
  • 使用 docker service ls 代替 docker ps
  • 使用 docker stack 代替 docker-compose

更多操作请查看官方文档DockerSwarmDoc

六、Portainer

Portainer是一款docker可视化管理后台,日常维护中建议使用Portainer而不用每次都登录服务器ssh去执行命令

1. 安装

执行命令,将docker权限提供给portainer容器,挂载数据卷并暴露到9000端口

数据会被持久化到 /root/volumes/portainer_data 目录,若想保存到其他地方,可自行修改

1
docker run -d --name ptr --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /root/volumes/portainer_data:/data portainer/portainer-ce:2.1.1

2. 管理

访问 http://127.0.0.1:9000,初次需要创建管理员账号,登录后即可进入管理后台,可对 StacksServicesContainersImagesNetworksVolumes等直接可视化操作。

需要注意的是,若在管理面板中,使用了私有镜像仓库,需要在左侧倒数第二个菜单 Registries 添加私有镜像仓库地址及授权信息。

评论