Docker

1. 准备阶段

具体安装流程可以参考官网,一步一步走没有问题的,这里这是总结下

卸载

1
2
3
4
5
6
7
8
9
10
11
 sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

安装

1
2
3
4
5
6
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io

启动和检查

1
2
3
4
systemctl start docker
docker version
docker run hello-world
docker images

配置阿里云镜像加速

1
2
3
4
5
6
7
8
9
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qwm8wimf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker 配置 vim

1
2
3
4
apt-get update
apt-get install vim

yum install unzip

2.基本命令

镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
13
#
docker search
mysql --filter=STARS=3000 # 查找 3000 starts 以上的
docker pull 镜像名[:tag] # 下载指定版本
#
docker images
-a --all # 列出所有的镜像
-q --quiet # 只显示镜像的 id
-aq # 常用
#
docker rmi
-f imageId1 imageId2 ... # 删除
-f $(docker images -aq) # 删除所有

容器命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 
docker ps # 查看正在运行的容器
-a # 查看曾经运行的容器
-a -n=? # 指定个数显示
-q # 只显示 imagesId
# docker run -d --name nginx01 -p 3344:80 nginx
docker run [] image[:tag]
-d # 以后台方式运行
-p 8080:8080 镜像名:tag
-it # 使用交互方式运行 前台运行
-p # 指定容器端口 -p 8080:8080
# 第一个端口是本地(公网) 第二个是容器内的
-p ip:主机端口:容器端口
-p 主机端口:容器端口 ## 常用
-p 容器端口
容器端口
--name xxx
-v 主机目录:容器内目录
## 匿名挂载 -v 容器内路径
docker ... -v 容器内路径 nginx
## 具名挂载 映射 自定义名字前不带斜杠
docker ... -v 自定义名字:容器内路径 nginx
### volume
docker volume ls
inspect 自定义名字
# /var/lib/docker/volumns/...
create
prune
rm
### -v 自定义名字:容器路径[:ro|:rw]
指定容器内部 读写权限
-e # 配置环境
-P # 随机指定端口 大写的P
--rm # 用完就删除掉
## 运行容器
docker run -it centos /bin/bash
## 进入容器
docker exec -it 容器名 /bin/bash # 开启一个新的终端
docker attach 容器ID # 进入正在运行的命令行 不是新窗口
## 退出容器
exit
按住 ctrl + p + q # 退出 但不关闭容器
## 删除容器
docker rm 容器ID
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm
## 启动容器
docker start 容器ID
## 重启容器
docker restart 容器ID
## 停止容器
docker stop 容器ID
## 强制停止容器
docker kill 容器ID

build

1
2
3
4
# 打包 Dockerfile 文件  
docker build -f dockerfile1 -t mydocker .
-f dockerfile文件名/文件路径
-t . 生成文件路径 .代表当前路径

帮助命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker version
docker info
docker --help
docker stats # 查看cpu
https://docs.docker.com/reference/
# 查看日志
docker logs
docker logs -tf 容器ID
docker logs -tf --tail [number] 容器ID
# docker run -d centos /bin/sh -c "while true;do echo 'eternallycyf';sleep 1;done"
# 查看 容器的进程信息 端口等等
docker top 容器ID
# 查看容器元信息
docker inspect 容器ID
# 将容器内的文件 复制出来
docker cp 容器ID:容器内路径 目的地主机路径
docker cp 容器ID:/home/eternall.md /home
#
docker history imageID --no-trunc

repository

dockerhub

1
2
docker login -u 用户名 -p 密码
docker logout

阿里云

1
2
3
4
5
6
# login
docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com
# pull
docker pull 镜像名:tag
# push
docker push eternallycyf/镜像名[:tag]

工作常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker tag centos eternallycyf/myCentos:1.0
#
docker commit -m='' -a='作者' 容器ID 目标镜像名:[tag]
# push
docker push eternallycyf/镜像名:tag
# pull
docker pull 镜像名:tag

# 将docker镜像压缩
docker save -o 压缩包名.zip 镜像名:tag
# 解压
docker load -i /usr/tmp/压缩包名.zip
# 上传到服务器
scp 压缩包名.zip root@公网地址:/user/tmp

容器互联 evth-pair

自定义网络

1
2
3
4
5
6
7
8
9
10
# 桥接 container host none
ip addr
docker network ls
docker network rm xxx
# docker0 默认 域名不能访问 --link 可以打通连接
docker run -d -p --net bridge tomcat
# 自定义网络
# driver 默认 subnet 子网 geteway 网关
docker network create --driver bridge --subnet 192.168.0.0/16 - geteway 192.168.0.1 mynet
docker xxx --net mynet tomcat
1
2
// 在hosts 配置里链接了 
--link 容器名

3. Dockerfile

  • 命名为 Dockerfile 就会自动找他

基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# from 基础镜像
FROM centos:7
# maintainer 维护者信息 姓名+邮箱
MAINTAINER eternallycyf<xxx@qq.com>
# run 构建时候需要运行的命令
RUN yum -y install vim
# add 集成别的东西 会自动解压
ADD 文件名 解压后的镜像内地址
# workdir 设置当前工作目录 / /bin/bash
WORKDIR $MYPATH
# valume 设置容器卷
VALUME
# expose 暴露端口
EXPOSE 80
# 运行
RUN

其他命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 脚本命令  只有最后一个会生效 可被替代 (覆盖) docker run xxx -l 就会替换掉 编写的 CMD ["ls","-a"]
CMD echo $MYPATH
CMD ["ls","-a"]
CMD echo '----end---'
CMD /bin/bash
# entrypoint 脚本命令 可以追加命令 不
ENTRYPOINT
# onbuild 当构建一个dockerfile 文件时 就触发这个指令
ONBUILD
# copy 文件拷贝到镜像中
COPY readme.txt /user/local/readme.txt
# env 环境变量 ENV
# 例如 MYPATH user/local
# 使用时候需要 $MYPATH
ENV MYPATH /user/local

数据卷共享

1
2
3
docker run -t --name docker01 容器ID 
docker run -it --name docker02 --volumes-from docker01 容器ID
这时这两个容器都是相互同步的 即使删除了 还在

项目打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 根目录创建 Dockerfile  
FROM node:12.16.1-alpine AS installer
COPY package.json ./
RUN npm i tyarn -g
RUN tyarn

FROM node:12.16.1-alpine AS builder
COPY --from=installer /node_modules ./node_modules
COPY . .
RUN npm run build

FROM vixlet/nginx:alpine
COPY --from=builder /dist /app
COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 80
# nginx.conf
server {
listen 80;
server_name 127.0.0.1;
access_log off;
add_header X-Frame-Options sameorigin always;
location / {
root /app;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
}

4. docker compose

基础步骤

1
2
3
4
5
6
7
dockerfile
docker-compose.yml
docker-compose up
docker-compose down
#
可以使用 Dockerfile 生成镜像
或者 docker-compose.yml image

命令

1
2
3
docker-compose up -d
# 重新构建
docker-compose up --build

yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 版本
version: "3.9"
# 服务
services:
web:
## build 生成的 指定dockerfile
build: .
ports:
- "5000:5000"
## 镜像
image: "redis:alpine
network:
## 部署
deploy:
### 副本
replicas: 6
# 其他配置
volumns:
network:
configs:

5. doker swarm

service

1
2
docker service ls
docker service update
1
2
3
4
5
6
7
8
9
10
11
12
#
双主双从: 假设一个节点挂了 其他节点是否可用
Raft 协议: 保证大多数节点存活才可以用 只要>1 集群至少大于3台
#
docker swarm init --advertise-addr IP地址
#
docker node ls
docker swarm join-token manager
docker swarm join-token worker
#
docker swarm leave
update

6. docker stack

1
2
3
4
# 单机
docker-compose up -d workpress.yaml
# 集群
docker stack deploy worldpress.yaml

7. docker secret

1
2
3
4
5
6
# 配置密码 证书
docker secrets
create
inspect
ls
rm

8. 工具

mysql

1
2
3
4
5
6
7
8
9
10
#
docker pull mysql:5.7
#
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=666222 --name mysql01 mysql:5.7
# navicat 3310 端口
公网地址:3310
root
666222
#
此时在 服务器的 /home/mysql/conf data 目录就映射成功了

mysql 多个共享

1
2
3
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=666222 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=666222 --name mysql02 --volumes-from mysql01 mysql:5.7

portainer

1
2
3
4
5
docker volume create portainer_data

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:latest

https://公网地址:9443/

9. bug

1
2
3
4
5
6
7
8
9
10
#
如果没有前台进程
docker就会自动停止
例如 nginx 启动后如果没有被用 就会立即停止
# tomcat
阿里云下载的镜像 默认是阉割版的
cp webapps.dist/* webapps
# elasticsearch 太占内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS='-Xms64m -Xmx512m' elasticsearch:7.6.2