留坑:iptables没看
Docker管理指令总结:www.processon.com/view/link/6...
一、Docker极速上手指南
0、基础
1、 配置docker源(用于安装docker)
a. 安装Docker服务
bash
#安装相关依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#下载官方的docker yum源文件
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#替换yum源地址
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#安装docker-ce
yum install -y docker-ce
systemctl enable --now docker
docker version
b. 配置镜像加速
c. 自动补全
yum install -y bash-completion bash-completion-extras
2、Docker C/S架构
cs client/server 客户端/服务端
Docker 服务端:docker daemon 叫dockerd
Docker 客户端:docker命令(下载镜像,运行容器 )
docker pull nginx
下载nginx镜像到本地仓库.
- 如果本地仓库有则提示镜像已经下载.
- 如果本地出仓库没有,则docker服务端访问远程仓库,下载镜像.
docker run -d -p 80:80 nginx
启动容器
- -d容器后台运行
- -p端口映射
- nginx镜像名字
shell
docker run -d -p 80:80 nginx
#docker客户端找dockerd服务端,问是否有nginx镜像
#如果有,则启动这个镜像,后台运行,访问容器端口是80端口.
#如果没有,则从远程仓库下载镜像,启动这个镜像,后台运行,访问容器端口是80端口.
#提示你本地没有nginx镜像 nginx:latest最新版
#查看ngx版本:https://hub.docker.com/_/nginx
#1、查看镜像
docker images
#2、查看容器
docker ps
注意事项: 此处使用到了docker -p端口映射公共,需要使用iptables的nat功能,需要开启系统的内核转发功能.
ini[root@docker01.oldboylinux.cn ~]# tail -1 /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@docker01.oldboylinux.cn ~]# sysctl -p net.ipv4.ip_forward = 1
3、Docker的镜像管理
docker images
和 docker image ls
等同。
perl
docker search 搜索镜像, 优先选官方,stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker load 导入镜像
docker save 导出镜像
#例子: docker load -i docker_nginx.tar.gz
#例子: docker save centos:7 -o docker_centos7.tar.gz
docker images 查看镜像列表
docker rmi 删除镜像
docker tag 给镜像打标签
a. 案例01:下载nginx:alpine镜像并查看
bash
#1.
docker pull 下载镜像
docker pull nginx:1.22-alpine
#2.
docker image ls 简写为docker images查看镜像
查找镜像:
docker search
访问hub.docker.com
镜像命名
bash
#指定版本
只写服务名字一般下载服务的最新版本.
nginx,下载ngx最新版本 nginx:latest
下载ngx最新稳定的版本 nginx:stable
下载指定的版本 nginx:1.20.2
#指定系统
nginx镜像默认的系统是Debian系统
docker pull nginx:1.20.2-alpine 使用alpine系统更加节约空间
b. 案例02:sl大法
保存docker镜像(save),其他节点上导入(load).
未来也可以搭建镜像仓库.
arduino
docker image save #docker save
docker image load #docker load
#1.1g个节点保存docker 镜像 -o输出到指定的文件.
docker save nginx:alpine -o nginx_alpine.tar
#2. 导入load
docker load -i nginx_alpine.tar
swift
docker images |awk 'NR>1{print "docker save",$1":"$2,"-o",$1"_"$2".tar"}'
#最后通过 |bash运行
#可以书写批量导出docker镜像脚本.
c. 案例03:删除镜像
条件:镜像不能在使用中.(没有基于这个镜像的容器).
ini
docker image rm == docker rmi
d. 案例04:镜像清理用命令
用于清理一些临时镜像,未来我们自定义镜像的时候会有.
arduino
docker image prune
docker images -a #可以查看系统中所有镜像,包含隐藏镜像.
e. 案例05:给镜像设置标签
给镜像设置一个新的名字. 类似于硬连接,id号保持一致,不会创建新的数据块。
应用场景:
- 自定义镜像.
- 搭建与使用内部镜像仓库.registry
csharp
[root@clb1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine cc44224bfe20 2 years ago 23.5MB
nginx latest 605c77e624dd 2 years ago 141MB
centos latest 5d0da3dc9764 2 years ago 231MB
[root@clb1 ~]# docker tag nginx:latest nginx:latest_3.13
[root@clb1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine cc44224bfe20 2 years ago 23.5MB
nginx latest 605c77e624dd 2 years ago 141MB
nginx latest_3.13 605c77e624dd 2 years ago 141MB
centos latest 5d0da3dc9764 2 years ago 231MB
f. 案例06:查看镜像详细信息
做镜像巡检的时候使用.
bash
docker 家目录/var/lib/docker/
#查看 nginx:alpine镜像的信息,输出的是json格式.
docker image inspect nginx:alpine
g. 案例07:json格式
arduino
#json形式数据:key value 键值对,变量和变量内容
{
"name": "harryYang",
"age": 38,
"height": 100,
"weight": "100kg"
}
perl
#新机型需要安装,处理json形式数据的专用命令:jq.
yum install -y jq
[root@clb1 ~]# cat json.txt | jq
{
"name": "harryYang",
"age": 38,
"height": 100,
"weight": "100kg"
}
[root@clb1 ~]# cat json.txt | jq .age
38
[root@clb1 ~]# cat json.txt | jq .name
"harryYang"
#处理复杂格式docker inspect,可以理解.就是进入的命令,一层一层的进入
[root@clb1 ~]# docker image inspect nginx:latest | jq .[].Id
"sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85"
二、Docker的容器管理
运行起来的镜像可以称为容器,1个容器相当于是1个进程.
bash
docker ps 查看容器列表 -a 查看所有容器
docker run 创建并运行容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker rm 删除容器
批量删除所有容器 docker rm -f `docker ps -qa`
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开 的快捷键ctrl +p,ctrl +q
a.查看当前运行中的容器,查看下80端口是 否被占用,如果没有运行1个nginx容器使用80端口
csharp
[root@clb1 ~]# docker run -d -p 80:80 --name shishu_nginx nginx:latest
2d601f16f939eeec43176b7cd1199171fb3fcea459293f2cf5efa10aa30709f3
[root@clb1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d601f16f939 nginx:latest "/docker-entrypoint...." 15 seconds ago Up 14 seconds 0.0.0.0:80->80/tcp shishu_nginx
#删除容器
#docker rm 容器
#如果容器运行中无法删除则使用rm -f强制删除.
b.创建centos容器并进入容器
arduino
docker run -it --name "centos_v1" centos
如果退出容器,那么容器状态会怎么样?
- -i 进入交互模式
- -t 分配一个终端(运行命令解释器) /bin/bash 或 /bin/sh
- -it 进入容器并有个命令行(终端).
好处运行容器的同时可以进入到容器中,缺点:退出容器则容器结束.
容器想要放在后台(-d)一直运行的话,那么容器运行对应初始命令。
必须夯住(阻塞/前台运行),否则容器就会退出。
bash#基础服务前台运行 nginx -g 'daemon off;' #nginx前台运行. /usr/sbin/php-fpm --nodaemonize #php前台运行. /usr/sbin/sshd -D #ssh前台运行. java -jar xxx.jar #java前台运行.
c. 如何进入已经运行的容器
bash
#0. 如果没有运行中的容器创建1个.
docker run -d -p 80:80 --name "nginx_alpine_v4" nginx:alpine
#1. 进入运行中的容器中
docker exec -it nginx_alpine_v4
#2. 修改ngx首页文件内容
echo docker_nginx_alpine_v4 >/usr/share/nginx/html/index.html
#3. 浏览器测试
扩展: 如何后台持续运行纯净系统的容器.
bash
#通过-itd + 指定命令解释器持续运行
docker run -itd --name centos_v6 centos /bin/bash
docker exec -it name xxx 镜像名字:版本 参数(一般/bin/bash 或/bin/sh)
用于与已经运行中的容器进行连接.
d. exec vs attach区别
e. docker run vs docker create,start,stop,restart
docker run背后
- docker pull #如果镜像不存在.
- docker create 创建容器.
- docker start 启动容器.
- docker stop 关闭容器. #向容器中的主进程,pid 1 进程发出信号(kill),关闭.
- docker restart重启重启.
f. 我们传输文件到容器中,如何做?
之前我们在windows/Mac与Linux之间通过lrzsz实现
在容器与主机之前用docker cp
g. 查看容器信息与状态
1、stats 查看所有运行中的容器的状态,如果要看所有加上-a选项.
docker stats
2、top 查看某一个容器的进程信息.
css
docker top centos
h.结束容器
docker stop关闭容器 docker rm删除容器
bash
docker kill -s 9 alpine_v4
-s表示信号 -s 9 等于 kill -9 pid强制结束.
i. commit用于自定义镜像
处理容器,生成镜像. 使用流程:
- 运行服务镜像或系统镜像,启动后成为容器.
- 根据我们的需求,对容器进行修改.
- 测试完成后. 最后通过commit命令把容器保存为镜像.
- 根据新生成的镜像创建容器并测试.
sql
docker commit restart_alpine_v1 nginx:alpine_restart_v1
#docker commit 容器名 镜像名
三、端口映射
使用docker的时候 外界访问docker容器中的服务或端口,需要使用端口映射.本质类似于iptables防火墙的端口映射.
应用场景: 未来容器需要被外界访问(80端口).需要暴漏在外界一个端口. 用户通过端口访问容器中的某个端口.
实现方法:docker run通过-p选项实现.
本质是通过iptables nat规则实现的.nat表中创建了docker自定义的链.
1、背后做了什么
添加了对应防火墙规则iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp dport 8888 -j DNAT to- destination 172.17.0.10:80
2、用户经历了什么
3、端口映射案例
a. 1对1 端口映射
arduino
docker run -d --name "nginx_80" -p 80:80 nginx:1.20.2-alpine
b. 映射多个端口
yaml
#一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 86:80 nginx:1.20.2-alpine
#表示连续
docker run -d -p 8084-8086:8080-8082 -p 88:80 nginx:1.20.2-alpine
c. ip 绑定端口
arduino
docker run -d --name "nginx_bind_ip" -p 172.16.1.81:12306:80 nginx:1.20.2-alpine
四、数据卷挂载
这里我们想个问题,创建了一个容器,容器里面存放很多代码,数据,软件包等等信息,不小心删除容器rm -f. 重新创建名字相同的容器,问数据还有没有?
如何解决数据持久化问题? 数据卷(挂载),让数据永久保存在宿主机中.
docker run -v
宿主机的路径:容器内部路径
ruby
mkdir -p /app/docker/conf/nginx/conf.d/ /app/docker/code/restart/
docker run -d --name restart_volume_v1 -p 80:80 \
-v /app/docker/restart/conf/nginx/conf.d/:/etc/nginx/conf.d/ \
-v /app/docker/restart/conf/nginx/nginx.conf:/etc/nginx/nginx.conf \
--restart=always nginx:alpine
容器时区问题
数据卷使用与容器架构
五、容器架构自动化部分
1、手动实现创建tengine镜像
目标: 手动根据Ubuntu20.04镜像,编译安装tengine并部署bird代码.
a)下载并启动ubuntu:20.04 容器
bash
docker run -itd --name "tengine_bird" ubuntu:20.04 /bin/bash
docker exec -it tengine_bird /bin/bash
b)配置apt源
bash
sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
apt update #生成apt缓存
c)下载软件包
bash
#1.安装常用软件
apt install -y vim curl
#2.下载软件包(手动下载然后从docker cp到容器中)
#下载链接:http://tengine.taobao.org/download/tengine-2.3.3.tar.gz
scp /Users/admin/Downloads/tengine-2.3.3.tar.gz root@47.96.172.71:/root/
#上传容器
tar xf tengine-2.3.3.tar.gz
docker cp /root/tengine-2.3.3 tengine_bird:/tmp
d)编译安装三部曲
安装依赖
- ./configure 进行编译安装的配置------》Makefile 用于编译.
- make #编译(根据Makefile配置进行编译)
- make install #创建目录,复制文件
csharp
#1、安装依赖
apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev
#2、进入解压目录,编译
./configure --prefix=/app/tools/tengine-2.3.3/ \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_mp4_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=modules/ngx_http_upstream_check_module/ \
--add-module=modules/ngx_http_upstream_session_sticky_module
#判断是否完成 root@26ffc8a9750a:/tmp/tengine-2.3.3# echo $? 0
#3、make编译
make -j 1
#4、make install编译安装
make install
#5. 检查
/app/tools/tengine-2.3.3/sbin/nginx -V
#6. 创建软连接
ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine
e)收尾,启动,测试
- 添加用户nginx
- 创建安装目录软连接
- nginx命令软连接到/sbin/下面.
- 启动与本地测试.
bash
#1. 添加用户nginx
groupadd nginx
useradd -s /sbin/nologin -g nginx nginx
#2. nginx命令软连接到/sbin/下面.
ln -s /app/tools/tengine/sbin/nginx /sbin
nginx -V
#3. 启动与本地测试.
nginx
#启动后会在后台运行.
echo tengine.cn >/app/tools/tengine/html/index.html
curl localhost
#返回显示tengine.cn
f)生成镜像
sql
docker commit tengine_bird tengine:2.3.3
g)运行容器
arduino
docker run -itd -p 80:80 --name test tengine:2.3.3 nginx -g 'daemon off;'
h)关于日志
/app/tools/tengine/logs/ 存放在容器中.
关于日志的处理
- 方案01 日志目录挂载到宿主机的某个目录中.
- 方法02 把日志软连接到/dev/stdout 和/dev/stderr中,未来可以通过docker logs 查看日志.
bash
ln -s /dev/stdout /app/tools/tengine/logs/access.log
#访问日志 stdout标准输出
#只要有访问日志生成就会输出到屏幕,就可以通过docker logs 查看
ln -s /dev/sdterr /app/tools/tengine/logs/error.log
#错误日志 stderr错误输出
#修改完成后记得重启容器.
2、自动实现Dockerfile实现
Dockerfile使用
bash
FROM nginx:alpine
LABEL author="oldboylidao996"
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'docker file oldboyedu linux' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
根据Dockerfile构建镜像
bash
docker build -t nginx:diy_img_test_v1 .
#注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名
运行
arduino
docker run -d --name 'nginx_v1' -p 81:80 nginx:centos7
3、Dockerfile中的指令
都是大写