Docker 学习
https://www.docker.com/get-started
可以通过Docker Desktop(Windows,MacOS)和命令行(Linux,Windows和MacOS)来学习Docker。
通过在Centos7.9
上安装Docker并进行实际操作。
Centos 7.9 安装Docker
-
查看内核版本
$ uname -a Linux msr-server 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
-
更新yum包
$ yum update
-
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ yum -y install gcc $ yum -y install gcc-c++ $ yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置的yum源
$ yum list docker-ce --showduplicates | sort -r # 或者阿里云yum $ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
查看仓库中docker版本,可以指定安装,不指定安装最新版本
$ yum list docker-ce --showduplicates | sort -r Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast Loaded plugins: fastestmirror Installed Packages docker-ce.x86_64 3:19.03.5-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.5-3.el7 @docker-ce-stable docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable Determining fastest mirrors Available Packages
-
安装docker
$ yum makecache fast $ yum install docker-ce
-
启动Docker,加入开机启动,验证安装
$ systemctl start docker $ systemctl enable docker $ docker version
-
配置阿里云镜像加速
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
$ sudo mkdir -p /etc/docker $ sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://6ui8r60i.mirror.aliyuncs.com"] } EOF $ sudo systemctl daemon-reload $ sudo systemctl restart docker
容器使用
查看Docker命令
$ docker
$ docker run --help
搜索并拉取镜像
$ docker search 镜像名
$ docker pull 镜像名
$ docker pull 镜像名:版本号
删除镜像
$ docker rmi 镜像名
启动容器
-it
参数说明,-i
表示交互的输入输出,-t
表示模拟容器终端
ubunut
镜像名,如果没有被拉取,提示无法找到,之后自动拉取
/bin/bash
: 指定执行的脚本
--name
: 指定容器的名字
--restart=always
:表示容器停止后,自动启动容器
$ docker run -it ubuntu /bin/bash --restart=always --name test-name
常用操作
查看所有容器
$ docker ps -a
查看运行中的容器
$ docker ps
启动容器
# docker start 容器id|容器name
$ docker start 2dfs3rrfwef
$ docker start gds-test
停止容器
# docker stop 容器id|容器name
$ docker stop 2dfs3rrfwef
$ docker stop gds-test
查看容器日志
# docker logs 容器id|容器name
$ docker logs 2dfs3rrfwef
$ docker logs gds-test
删除容器
#docker rm 容器id
$ docker rm 2dfs3rrfwef
进入容器
$ docker exec -it 243c32535da7 /bin/bash
复制文件
文件复制支持双向操作
复制文件到容器
$ docker cp /var/wwwroot/koa-test/ 容器id:/var/wwwroot/
从容器复制文件到本地
$ docker cp 容器id:/var/wwwroot/koa-test/ /var/wwwroot/
升级容器
生成镜像
通过Dockerfile
文件配置打包命令,并进行打包操作。
打包前的准备
在项目根目录,创建Dockerfile
,内容如下:
此代码打包后的体积接近1GB,建议使用下面的优化版本。
FROM node
ADD . /var/wwwroot/koa-test/
WORKDIR /var/wwwroot/koa-test/
RUN cd /var/wwwroot/koa-test/ && npm install
EXPOSE 3010
CMD ["npm", "start"]
打包优化
alpine
是最小的可运行linux容器,安装node
和npm
后就构建完毕。构建的镜像体积不到100MB。
FROM alpine #最小的linux容器,大概只有5MB
RUN apk add --update nodejs npm #安装nodejs 和 npm
ENV NODE_ENV production #设置运行环境为production
WORKDIR /var/wwwroot/koa-test/ #设置当前的工作目录
COPY . . #复制文件
RUN npm ci --only=production #安装依赖
EXPOSE 3000 #暴露端口
CMD ["npm", "start"] #初始化执行脚本
打包
在项目目录,运行下面的脚本
$ docker build -t node-gds-koa ./
$ docker build -t gds-koa-nosync ./
打包时使用代理
$ docker build -t gds-koa-alpine ./ --build-arg https_proxy=http://172.17.0.1:1080
运行生成的镜像
#image:
$ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 node-gds-koa
#image:
$ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 gds-koa-nosync
导出镜像文件
#将镜像gds-koa-nosync导出到当前目录的gds-koa-nosync.tar
$ docker save gds-koa-nosync > gds-koa-nosync.tar
导入镜像文件
#将当前目录的gds-koa-nosync.tar镜像文件导入到Docker
$ docker load < gds-koa-nosync.tar
Docker Compose
配置文件
可以在配置文件里调用环境变量,语法
${DB_PASS}
Ubuntu
Linux下可以创建
/root/.env
文件,批量设置环境变量参数。DB_NAME=gdscms DB_PASS=root DB_PASS=123456
之后修改
/root/.profile
,并在最后添加:set -o allexport; source /root/.env; set +o allexport
使用
printenv
查看所有环境变量CentOS
...todo....
配置文件docker-compose.yml
version: "3"
services:
nginx:
image: nginx:stable-alpine
ports:
- "3000:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
koa-app:
build: .
environment:
- PORT=3000
depends_on:
- db
db:
image: postgres:10.18-alpine
restart: always
environment:
POSTGRES_DB: gdscms
POSTGRES_PASSWORD: ${DB_PASS}
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- postgres-db:/var/lib/postgresql/data
volumes:
postgres-db:
配置文件docker-compose.dev.yml
version: "3"
services:
koa-app:
build:
context: .
args:
NODE_ENV: development
volumes:
- ./:/app/
- /app/node_modules
environment:
- NODE_ENV=development
- GDS_DB_TYPE=postgres
- GDS_DB_HOST=db
- GDS_DB_USER=postgres
- GDS_DB_PASS=****
command: npm run dev
jenkins:
image: jenkins/jenkins:lts
ports:
- "50001:50001"
- "8080:8080"
environment:
- JENKINS_SLAVE_AGENT_PORT=50001
volumes:
- jenkins-data:/var/jenkins_home
volumes:
jenkins-data:
运行
简单运行
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
负载均衡运行
创建./nginx/default.conf
的nginx配置文件
server {
listen 80;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://koa-app:3000;
proxy_redirect off;
}
}
运行
添加
--scale
参数,并在后面加上容器名称=数量
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --scale koa-app=2
使用Aliyun管理镜像
新建Aliyun仓库
进入阿里云镜像服务控制台,新建镜像仓库。
在新建之前,需要创建一个registry
登录密码。
设置完密码之后,进入到仓库管理界面
设置代码源可以使用Github,Gitee等等,选择本地仓库。
- 命名空间:相当于组织名
- 仓库名称:Docker容器的名字
登录仓库
$ docker login --username=email@domain.com registry.cn-hangzhou.aliyuncs.com
推送到Aliyun
如果没登录,需要先登录,并输入在新建阿里云仓库之前设置的
Registry
密码
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
示例
首先使用
docker images
命令查询需要push的镜像ID为e3a1bb06d900
$ docker tag e3a1bb06d900 registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:v1
$ docker push registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:v1
从Aliyun拉取
$ docker pull registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
自动化 Docker watchtower
https://github.com/containrrr/watchtower
需要使用镜像名称启动容器。
watchtower 会自动根据镜像名称最前面内容,获取镜像的实际请求URL地址。
运行
环境变量:
- WATCHTOWER_TRACE=true
- WATCHTOWER_DEBUG=true
- WATCHTOWER_POLL_INTERVAL=50
$ docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower container_to_watch
私有仓库
docker run -d --name watchtower -e REPO_USER=email@domain.com -e REPO_PASS=*** -e WATCHTOWER_POLL_INTERVAL=50 --restart always -v /Users/joy/.docker/config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower gds-01 --debug
私有库
如果是私有库,需要传入用户名和密码
$ docker run -d \
--name watchtower \
-e REPO_USER=username \
-e REPO_PASS=password \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower container_to_watch --debug
Docker compose
使用Docker compose方式
version: "3"
services:
cavo:
image: index.docker.io/<org>/<image>:<tag>
ports:
- "443:3443"
- "80:3080"
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: --interval 30
自动删除旧镜像
使用 --cleanup
参数在更新后自动删除旧的镜像。
仅监控更新情况,不更新
使用 --monitor-only
将仅监控新镜像并发送通知,不会更新容器。
设置自动更新检查频率
使用 --interval
设置设更新检测时间间隔,单位为秒。比如每隔 1 个小时检查一次更新则为 --interval 3600
通知提醒
当容器更新时,watchtower 可通过日志系统中的 hooks 发送通知。要发送的通知类型可通过 --notifications
参数(或环境变量 WATCHTOWER_NOTIFICATIONS
)设置,可设置的值包括:
•email
:通过 e-mail 发送通知•slack
:通过 Slack webhook 发送通知•msteams
:通过 MSTeams webhook 发送通知•gotify
:通过 Gotify 发送通知•shoutrrr
:通过 containrrr/shoutrrr 发送通知
比如我们想通过电子邮件接收通知,就可以设置以下命令行选项或它们对应的环境变量:
docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ -e WATCHTOWER_NOTIFICATIONS=email \ -e WATCHTOWER_NOTIFICATION_EMAIL_FROM=fromaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_TO=toaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=fromaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password \ -e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \ containrrr/watchtower
--notification-email-from
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_FROM
):邮件发送地址--notification-email-to
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_TO
):邮件接收地址--notification-email-server
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SERVER
):设置 SMTP 服务器--notification-email-server-tls-skip-verify
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SERVER_TLS_SKIP_VERIFY
):不验证邮件服务器的 TLS 证书--notification-email-server-port
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT
):设置 SMTP 的短裤男,默认为25
--notification-email-server-user
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER
):SMTP 的用户名--notification-email-server-password
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD
):密码--notification-email-delay
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_DELAY
):发送通知之前的延迟(秒)--notification-email-subjecttag
(环境变量WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG
):包含在主题标签中的前缀
Docker Swarm
查看Dockers Swarm状态
此处会显示docker swarm状态,默认为inactive
docker info
启用
此处会生成专用的加入密匙,可以将其他的docker加入进来
支持参数:
- --advertise-addr: 默认的IP和端口,如
192.168.1.18:2377
- --listen-addr: 默认的IP和端口,如
192.168.1.18:2377
docker swarm init
加入
如果需要加入其他的docker manager,使用下面的命令加入
docker swarm join --token SWMTKN-1-1ad4l1v44lfu7quhuj4u5l5dju7j2p1942nr995umvycp5a1f9-6oc0y4w2i7yi0p5d8gtefzr4d 192.168.65.3:2377
docker-compose.yml配置
运行
docker stack deploy -c docker-compose.yml -c docker-compose.prod.yml myapp
查看所有节点
docker node ls
查看所有stack
docker stack ls
查看stack的所有services
docker stack services myapp
查看所有services
docker service ls