Docker 学习
通过在
Centos7.9 上安装Docker并进行实际操作。
Centos 7.9 安装
-
查看内核版本 $ uname -a
Linux msr-server 3.10.0-514.26.2.el7.x86_64
-
更新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-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
-
配置阿里云镜像加速
每个账户对应的mirrors地址是唯一的,请将https://******.mirror.aliyuncs.com 替换你自己的地址。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******.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 镜像名
启动容器
启动容器,可以使用容器ID 或容器名称 启动,推荐使用容器名称。
-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 2dfs3rrfwef
$ docker start gds-test
停止容器
$ docker stop 2dfs3rrfwef
$ docker stop gds-test
查看容器日志
$ docker logs 2dfs3rrfwef
$ docker logs gds-test
删除容器
$ 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
运行生成的镜像
$ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 node-gds-koa
$ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 gds-koa-nosync
导出镜像文件
$ docker save gds-koa-nosync > gds-koa-nosync.tar
导入镜像文件
$ 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGFYRuJk-1631372611606)(C:\Users\joy\AppData\Roaming\Typora\typora-user-images\image-20210903075844426.png)]
使用Aliyun管理镜像
新建Aliyun仓库
进入阿里云镜像服务控制台,新建镜像仓库。
在新建之前,需要创建一个registry 登录密码。
设置完密码之后,进入到仓库管理界面
设置代码源可以使用github,阿里云comide等等,选择本地仓库。
- 命名空间:相当于组织名
- 仓库名称:Docker容器的名字
登录仓库
需使用正确的username,执行后,会提示输入登录密码
$ 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=PASSWORD -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
|