Docker 是一个用Go语言实现的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后运行到任何安装了 docker 的服务器上,达到一次构建,多次复用。
一、安装
1. 软件安装
Windows 和 MacOS 分别前往Docker Desktop for Windows和Docker Desktop for Mac下载安装。
Linux 系统使用官方的一键安装命令
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
若非root用户,可执行命令将当前用户加入 docker
组,而后重新登录ssh即可
sudo usermod -aG docker ${USER}
2. 配置国内源
桌面版打开设置面板-Docker Engine
进行设置保存,linux下编辑/etc/docker/daemon.json
文件保存并重启服务
{
"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的环境中。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vi /etc/systemd/system/docker.service.d/proxy.conf
并填入以下内容,其中 192.168.1.1:7890
请替换为你自己的代理。
[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"
而后重启即可
sudo systemctl daemon-reload
sudo systemctl restart docker
二、镜像
镜像对于docker来说有点类似于windows的exe文件或mac的app应用程序,将程序执行环境都打包成了镜像,当需要运行时,只需要将镜像放于任意需要运行的服务器上运行即可
1. 查看镜像
$ 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删除
docker rmi nginx:latest
docker rmi 6b3e1257976b
3. 查找镜像
查询有哪些可用镜像可执行查询命令,该命令会查询docker公共仓库
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
,也可手动指定镜像版本号
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
启动应用
FROM docker.io/seepine/alpine:openjdk8
WORKDIR workspace
COPY build/libs/*.jar /workspace/application.jar
ENTRYPOINT java -jar application.jar
此时在终端中执行jar构建出需要的jar包后
./gradlew bootJar
再执行构建镜像命令即可构建出镜像 seepine/springboot-test:v1.0
docker build -t seepine/springboot-test:v1.0 .
关于 Dockerfile
更多规则可查看官方文档DockerfileDoc
7. 推送镜像
镜像构建后只存在于你本地,需要将镜像推送到镜像仓库中,其他服务器上才能拉取得到你构建的镜像 ,推送到镜像仓库根据你构建时镜像名称,并且推送前需要先执行docker login
或docker login registry.cn-hangzhou.aliyuncs.com
进行登录,否则会无推送权限
docker push seepine/springboot-test:v1.0
三、容器
镜像运行之后就会变为容器,因此可知,同一个镜像是可以运行多次,变为多个容器,并且每个容器直接默认都是相互隔离的,有独立的环境、独立的ip、独立的端口等
1. 查看容器
$ 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. 运行容器
执行以下命令即可运行一个容器(当镜像不存在时会自动拉取镜像),并可看到运行日志,但此时我们无法访问,因为容器是独立的
docker run nginx
通过 -p
参数将容器的端口映射到本机端口,此时通过本机ip:port
即可访问到容器
docker run -p 8080:8080 nginx
3. 进入容器
有时我们不仅仅需要运行容器,还需要进入容器内修改某些文件,可使用命令进入到容器内部
docker exec -it c01701b64b4b sh
4. 挂载目录
我们运行的容器都是一次性的,即当我们进入容器内修改了文件后,当容器重启后,一切文件将会复原到容器镜像最初的样子,因此我们可以使用 -v
将容器内某些目录挂载出来,实现持久化。
例如以下命令,表示将容器的 /usr/share/nginx/html
目录,挂载到本机的 /root/data
目录,此时不需要进入到容器内,直接修改本机的 /root/data
目录中的文件即可生效,并且容器重启后文件依然存在。
docker run -p 8080:8080 -v /root/data:/usr/share/nginx/html nginx
当然若我们需要持久话,但又不想手动去选择挂载到本机的哪个目录,可以借助 docker volume
,即将本机目录替换为任意名词,docker 会自动帮我们创建 volume
进行保存,更多信息可查看官方文档 DockerVolumesDoc
docker run -p 8080:8080 -v nginx-data:/usr/share/nginx/html nginx
5. 停止容器
容器停止后需要使用
docker ps -a
才能查询到
docker stop c01701b64b4b
6. 删除容器
docker rm c01701b64b4b
四、DockerCompose
当运行容器增多时,一个个容器运行明显麻烦且效率低,此时可借助docker compose进行容器编排
本节内容繁多只顺便一提,需要深入了解和查看官方文档
1. 准备docker-compse.yml文件
表示会启动三个nginx服务,分别映射到端口8080
、8081
、8082
,并挂载卷 nginx-data
,更多编写规则可查询官方文档ComposeFileDoc
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. 启动
docker-compose up
3. 停止
docker-compose down
五、DockerSwarm
Docker compose解决了容器编排问题,而当服务器众多,我们仍然需要到每台服务器上去运行,还需要规划每台服务器内存多大,需要部署哪些应用。该场景下,可通过DockerSwarm将所有服务器的docker连结在一起,我们只需要在管理服务器上进行容器编排,docker会自动平衡服务器资源,将容器自动分配到每台服务器上去运行
本节内容繁多只顺便一提,需要深入了解和查看官方文档
1. 创建swarm集群
在管理服务器(也称管理节点)执行初始化
$ 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. 加入集群
在子服务器(也称工作节点)执行管理节点初始化时生成的加入指令
docker swarm join --token SWMTKN-1-53hrzq18zohy9yr1vskutfjyrs2a590xz9d0mjj2m15zu9mtsf-2938j5f50t35ycut0vbj2sx0s 192.168.1.100:2377
此时在管理节点执行以下指令即可查看到工作节点已加入
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
目录,若想保存到其他地方,可自行修改
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,初次需要创建管理员账号,登录后即可进入管理后台,可对 Stacks
、Services
、Containers
、Images
、Networks
、Volumes
等直接可视化操作。
需要注意的是,若在管理面板中,使用了私有镜像仓库,需要在左侧倒数第二个菜单 Registries
添加私有镜像仓库地址及授权信息。
博客内容遵循:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文永久链接是:seepine.com/docker/star…