Docker培训
1、环境准备
所有的环境,基于阿里云服务器 ECS(Elastic Compute Service)进行创建,前提需要大家准备好阿里云账号并充值100以上。
注:只要准备 阿里云账号 , 充值 就可以了,不需要马上建实例,培训的时候再来创建实例。
1.1、前期准备
- 阿里云环境
- SSH工具:XShell、SecureCRT (随便哪个,自己用着习惯就好)
- 注:docker测试,只需要参照着,建一个实例(一台服务器)就是了
1.2、常用VI操作
:wq 保存退出
:q! 强制退出不保存
yy 复制一行, 3yy 复制当前行后3行
P 粘贴复制的内容,一般与yy配合适用
dd 删除一行,3dd 删除3行
u 撤销上一次操作
r 替换当前光标的字符
R 替换光标后面的字符
S/i 在当前位置插入,与i效果一致
S/cc 删除当前行,在当前行插入
I 大写I在当前行首插入
a 在当前行下一个字符插入
A 在当前行末插入
cw 删除光标后面的单词内容,插入新输入的内容
x 删除光标后一个字符
X 删除光标前一个字符
:set paste 以纯拷贝粘贴,不会启动自动缩进
:set nu 显示行号
:set shiftwidth=1 设置缩进的空格数< 左缩进,>右缩进
: 1,5>> 第1到第5行右移2个空间,根据shiftwidth的设置来移动多少个空格
/ 查找,如/test(查询文件中的test,按n查找下一处)
2、docker安装
2.1、修改主机名
# 对应阿里云中docker-dev 实例
hostnamectl set-hostname docker-server
su
2.2、同步/etc/hosts
编辑好host,这IP为云服务中的私有IP,不要复制错了
# 编辑hosts
vi /etc/hosts
# docker host
172.24.85.243 docker-server
系统性能调优
2.3、cat >> /etc/sysctl.conf<<EOF
# 开启路由功能
net.ipv4.ip_forward=1
# 避免cpu资源长期使用率过高导致系统内核锁
kernel.watchdog_thresh=30
# 开启iptables bridge
net.bridge.bridge-nf-call-iptables=1
# 调优ARP高速缓存
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
EOF
# 模块加载
modprobe br_netfilter
# 保存配置
sysctl -p
docker安装
2.4、# 卸载旧版本Docker软件
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
container*
# 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data \
lvm2 bash-completion;
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo;
# 查看docker的版本
yum list docker-ce --showduplicates | sort -r
# Step 3: 安装 Docker-CE
sudo yum -y install --setopt=obsoletes=0 docker-ce-19.03.8 docker-ce-selinux-19.03.8;
# 设置开机启动
sudo systemctl enable --now docker;
daemon.json配置
2.5、cat <<EOF>> /etc/docker/daemon.json
{
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"insecure-registries": ["192.168.1.100"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
#配置生效
systemctl restart --now docker
3、docker常用命令
3.1、运行hello-world
# 查找镜像(从hub.docker查找)
docker search hello-world
# 拉取镜像
docker pull hello-world
# 查看镜像
docker images
# 运行
docker run hello-world
3.2、运行nginx
# 创建两个目录:nginx、html
mkdir -p /srv/nginx/html
# 运行一个nginx,将80端口映射到缩主机的8000 (--rm 容器停止后删除,-d 后端运行,-p端口映射)
docker run --name nginx --rm -d -p 80:80 nginx:1.17
# 查看运行的容器
docker ps
# 查看所有容器,包括退出的容器
docker ps -a
# 复制nginx配置文件(一般只要复制 conf.d就可以了)
cd /srv/nginx
docker cp nginx:/etc/nginx .
mv nginx conf
# index.html的内容 : <h> hello nginx </h>
cd /srv/nginx/html
echo '<h> hello nginx </h>' > index.html
docker stop nginx
# 映射缩主机目录到容器
docker run --name nginx -d -p 80:80 \
-v /srv/nginx/conf:/etc/nginx \
-v /srv/nginx/html:/usr/share/nginx/html \
nginx:1.17
# 查看容器日志 类似 tail -f
docker logs -f <CONTAINER ID/NAME>
# 查看iptables 配置规则
iptables -nL
3.3、镜像推送
# 给镜像打标签
docker tag nginx:1.17 lawmancs/nginx:1.17
#登录
docker login
#退出
docker logout
# 推送镜像
docker push lawmancs/nginx:1.17
# 删除容器,删除镜像
docker rm -f nginx
docker rmi -f nginx:1.17 lawmancs/nginx:1.17
# 拉取镜像(如果设置了私有镜像,就需要登录才能拉取,docker hub普通用户只能设置一个私有镜像)
docker pull lawmancs/nginx:1.17
# 运行镜像
docker run --name nginx -d -p 80:80 \
-v /srv/nginx/conf:/etc/nginx \
-v /srv/nginx/html:/usr/share/nginx/html \
lawmancs/nginx:1.17
# 停止镜像
docker stop nginx
# 启动镜像
docker start nginx
3.4、清理环境
# 清理环境
docker rm -f nginx
docker rmi -f lawmancs/nginx:1.17
4、docker网络
4.1、docker网络相关操作
# 列出docker网络 (docker内置三个网络:bridge,host,none)
docker network ls
# 查看某个网络详细信息(如:查看bridge网络详细信息)
docker network inspect bridge
# 查看某个容器信息
docker inspect <CONTAINER ID/NAME>
# 创建my_bridge网络
docker network create my_bridge
# 查看my_bridge网络信息
docker network inspect my_bridge
# 查看缩主机ip信息(可以看到增加了一个网桥br-<network id> )
ip a
# 指定容器运行在自定义网络
docker run -it --rm --name busybox1 --network my_bridge busybox:1.28 sh
# 再开一个终端,再运行一个容器
docker run -it --rm --name busybox2 --network my_bridge busybox:1.28 sh
#在 busybox1 容器ping busybox2
/ # ping busybox2
PING busybox2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.090 ms
#在 busybox2 容器ping busybox1
/ # ping busybox1
PING busybox1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.095 ms
# 退出busybox2,再建一个不指定网络(默认docker0)
docker run -it --rm --name busybox2 busybox:1.28 sh
# 再尝试在两个容器相互ping
/ # ping busybox2
ping: bad address 'busybox2'
4.2、网桥配置
# 安装 bridge-utils
yum install -y bridge-utils
# 查看当前网桥
brctl show
# 停止服务,并删除docker0网桥
systemctl stop docker
ip link set dev docker0 down
brctl delbr docker0
# 然后创建一个网桥 bridge0
brctl addbr bridge0
ip addr add 192.168.5.1/24 dev bridge0
ip link set dev bridge0 up
# 查看确认网桥创建并启动
ip addr show bridge0
# /etc/docker/daemon.json 中添加如下内容
{
"bridge": "bridge0",
}
# 重启docker
systemctl start docker
# 运行一个应用,检查是否默认连到新建的bridge0网桥上
docker run --name nginx --rm -d -p 80:80 nginx:1.17
# 断开容器网络
docker network disconnect bridge nginx
# 连接容器网络
docker network connect bridge nginx
4.3、清理环境
# 清理环境
docker rm -f nginx
docker rmi busybox:1.28
docker network rm my_bridge
5、docker数据卷
5.1、docker volume
# 创建一个数据卷
docker volume create my-vol
# 查看所有数据卷
docker volume ls
# 查看指定数据卷详情
docker volume inspect my-vol
# 使用 --mount 标记来将 数据卷 挂载到容器里 (等同与-v)
# -v my-vol:/usr/share/nginx/html \
docker run -d -p 80:80 \
--name nginx \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:1.17
# 查看容器信息
docker inspect nginx
# 删除数据卷
docker volume rm my-vol
# 清理无主的数据卷
docker volume prune
5.2、挂载主机目录/文件
# 挂载主机目录 (需要保证挂载的目录存在,否则会报错)
# -v /srv/nginx/html:/usr/share/nginx/html \
# 创建nginx/html目录,添加一个index.html文件,写个123456到文件
mkdir -p /srv/nginx/html
touch /srv/nginx/html/index.html
echo 123456 > /srv/nginx/html/index.html
docker run -d -p 80:80 \
--name nginx \
--mount type=bind,source=/srv/nginx/html,target=/usr/share/nginx/html \
nginx:1.17
# 以只读方式挂载主机目录
# -v /srv/nginx/html:/usr/share/nginx/html \
docker run -d -p 80:80 \
--name nginx \
--mount type=bind,source=/srv/nginx/html,target=/usr/share/nginx/html,readonly \
nginx:1.17
# 进入容器
docker exec -it nginx bash
cd /usr/share/nginx/html
# 设置了readonly后可以尝试到容器目录中去写文件
touch test.yaml
# touch: cannot touch 'test.yaml': Read-only file system
# 挂载文件
# -v /srv/nginx/html/index.html:/usr/share/nginx/html/index.html \
docker run -d -p 80:80 \
--name nginx \
--mount type=bind,source=/srv/nginx/html/index.html,target=/usr/share/nginx/html/index.html \
nginx:1.17
5.3、清理环境
# 删除容器
docker rm -f nginx
# 删除创建的目录
rm -rf /srv/nginx
6、docker 镜像构建
6.1、docker-demo镜像构建
# 创建目录
mkdir docker-demo
cd docker-demo
# 创建3个文件,文件的内容在/demo/docker-demo下
touch server.js package.json Dockerfile
# 构建镜像
docker build -t docker-demo:1.0 .
# 查看镜像
docker images
#启动镜像
docker run --name docker-demo -d -p 9000:3000 docker-demo:1.0
# 打镜像标签
docker tag docker-demo:1.0 lawmancs/docker-demo:1.0
# 推送镜像 用户名/标签名
docker push lawmancs/docker-demo:1.0
# 拉取镜像
docker pull lawmancs/docker-demo:1.0
# 运行镜像
docker run --name docker-demo -d -p 9000:3000 lawmancs/docker-demo:1.0
# 访问 主机IP+9000端口访问
# 导出镜像
docker save > docker-demo.tar lawmancs/docker-demo:1.0
# 导入镜像
docker load < docker-demo.tar
# 从容器中导出镜像 (-o 输出到文件)
docker export -o docker-demo-c.tar docker-demo
# docker export > docker-demo-c.tar docker-demo
# 导入从容器中导出的镜像
docker import docker-demo-c.tar docker-demo:1.0
6.2、清理环境
# 删除容器 -f参数强制删除
docker rm -f docker-demo
# 删除镜像
docker rmi lawmancs/docker-demo:1.0
# 删除docker-demo
rm -rf docker-demo
7、docker-compose安装
# 下载docker-compose
wget https://docs.rancher.cn/download/compose/v1.25.4-docker-compose-Linux-x86_64
# 将文件添加一个执行权限
chmod +x v1.25.4-docker-compose-Linux-x86_64
# 移到文件到bin目录
mv v1.25.4-docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# 查看版本信息
docker-compose version
8、docker-compose实践
docker-compose.yml
文件
8.1、创建 version: "3"
services:
db:
image: mysql:8.0
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wiseda@1234
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wordpress-net
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
networks:
- wordpress-net
volumes:
db_data:
networks:
wordpress-net:
8.2.docker-compose 相关命令
# 启动当前目录下docker-compose.yml (可以加-d参数,后台运行)
docker-compose up
# 停止docker-compose.yml中所有服务
docker-compose stop
# 启动docker-compose.yml中所有服务
docker-compose start
# 删除docker-compose.yml中所有服务
docker-compose down