2.docker容器技术的常用指令
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.docker镜像(image)常用命令
docker search 搜索镜像,优先选官方。stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker load 导入镜像
例子:docker load -i docker_nginx.tar.gz
docker save 导出镜像
例子:docker save centos:7 -o docker_centos7.tar.gz
docker image ls 查看镜像列表
docker rmi 删除镜像
docker tag 给镜像打标签
docker search 搜索镜像, 优先选官方,stars数量多(尽量不选择第三方镜像)

第三方镜像不支持搜索,特点是特别长。
官方仓库地址:https://hub.docker.com/
官方仓库 官方镜像 nginx:alpine
官方仓库 用户上传镜像 id/nginx:alpine
第三方仓库 用户上传镜像 docker.mirrors.ustc.edu.cn/library/nginx:alpine
docker pull 拉取镜像(下载镜像),注意版本
docker pull nginx ==> docker pull nginx:latest(默认最新版,也可以手动接版本,例如下图)

docker save ##导出镜像#可以导出多个镜像到一个压缩包里
[root@docker01 ~]# docker image save docker.mirrors.ustc.edu.cn/library/nginx:alpine -o docker_alpine_nginx.tar.gz
[root@docker01 ~]# scp -rp docker_alpine_nginx.tar.gz root@10.0.0.12:/root
docker image load ##导入镜像
[root@docker02 ~]# docker image load -i docker_alpine_nginx.tar.gz

[root@docker02 ~]# docker images (导入成功后可以看到本地有这个镜像)
docker的导入导出功能可以节省很多流量带宽,不用连接官方镜像

docker image import也是导入镜像,与docker image load -i的区别在于import导入的镜像没有名字和标签,只有镜像id。所以一般不使用import

##但是如果出现docker load -i导入报错可以使用以下命令
[root@docker01 ~]# cat prometheus-2.28.0-rc.0.linux-arm64.tar.gz |docker import - prometheus-2.28.0:prometheus
问题分析
查阅资料发现这个由于 docker load 和 docker import 的区别导致.
因为压缩包如果是用 docker save 打包的,就可以用 docker load,但是如果压缩包是用 docker export 打包的,那就需要用 docker import
docker image rmi 删除镜像(可以用id来删除镜像,也可以用名字)
docker rmi ==> docker image rm [root@docker02 ~]# docker image rmi a6eb2a334a9f

docker image tag ## 给镜像打标签
[root@docker02 ~]# docker tag 7a53a5be179f sunfuyang:1997
不接版本号的话默认是latest
同个镜像可以多个名字,其实都是一个镜像,类似于Linux里的硬链接

docker image prune ##清理无效镜像
[root@docker02 ~]# docker image prune
##清理的是没有名字标签的镜像
生产环境中如何批量的导入镜像以提高工作效率,节省时间??
用for循环来批量导入即可!
[root@docker01 ~]# for n in `ls *.tar.gz`;do docker load -i $n ;done
2.docker容器(container)的常用命令
docker image下面都属于镜像有关命令
docker container下面属于容器有关命令
docker network 都是属于网络有关命令
docker volume 都属于卷,存储等相关命令
几乎所有命令都是可以缩写的
例如:docker run ==> docker container run
docker run 创建并运行容器(例子:docker run -d -it -p 80:80 nginx:latest)
docker run的时候所有参数必须写在镜像名称前面,否则会报语法错误!!
演示:(启动人生中第一个容器)
[root@docker01 ~]# docker run -it centos:7
#-i 交互式 -t 终端 -it建立一个交互式的终端#注意,必须有终端才行,例如centos镜像
[root@docker01 ~]# docker container run -it centos
[root@c92e0ca09887 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#这个启动的容器是最小化安装的,查看网卡配置信息的命令都没有,需要优化系统哟~
#退出当前的容器是exit退出后容器被杀死
docker ps 查看容器列表 等于docker container ls
-a 查看所有容器
-l 只显示最新的、运行时间最短的容器
[root@docker01 ~]# docker container ps -a (不加-a参数就是只显示正在运行的容器)
第一列:是容器的id号
第二列:是镜像名称
第三列:容器的初始命令
第四列:容器的创建时间
第五列:容器的状态
第六列:是否做了端口映射
第七列:容器的名字
再次执行 docker run -it centos:7 会发现启动了一个新的容器,之前在上一个容器装的命令新容器里并不能运行,如何解决这个问题呢?只能是在底层修改镜像。
[root@docker01 ~]# docker run -it centos:7
docker create 创建容器 –name(默认是随机创建名字,名字不能相同)
[root@docker01 ~]# docker contain create nginx:latest

docker start ## 启动容器,可以接名字也可以接id号码
docker stop ## 停止容器,可以接名字也可以接id号码
docker restart ## 重启容器,可以接名字也可以接id号码
docker run ==> docker create + docker start(所以一般都是用docker run )
docker kill 强制停止容器
[root@docker01 ~]# docker kill edf2ba81e7b3
docker rm 删除容器(不能删除正在运行中的容器)
[root@docker01 ~]# docker rm ffe962a05172
#docker rm -f可以强制删除正在运行中的容器
[root@docker01 ~]# docker rm -f determined_cori

#批量删除所有容器 docker rm -f `docker ps -a -q` (也可以像下面那样在后面多接几个容器的id号码或名字都可以)
[root@docker01 ~]# docker rm -f a57e16a1733a eac05eb0547b
[root@docker01 ~]# docker rm -f `docker ps -a -q`###a代表全部容器,q是只打印id,组合起来是删除所有
如何进入一个正在运行中的容器?两种方法:
docker attach 进入正在运行的容器(各个容器使用相同的终端),偷偷离开的快捷键ctrl +p +q###不推荐
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
##所以,使用docker exec才是最合理的,exec会分配一个新的终端
容器想要放在后台一直运行的话,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出
[root@docker01 ~]# docker run -d -it centos:7 tail -f /etc/hosts
-d 参数是在后台运行
#不加-d参数会在前台夯住,能夯住就能一直运行
运行nginx的容器是debian的系统,yum就不能用了,需要用apt-get
nginx -g 'daemon off;' (意思是让nginx在前台运行,并且夯住)
3.docker容器端口映射
什么是端口映射?
端口映射是NAT的一种,功能是把在公网的地址转翻译成私有地址
端口映射的使用场景:
通过互联网来访问公司内部服务的时候,就会需要用到端口映射
docker run不用配置宿主机的iptables规则,-p参数直接做映射。
-p 宿主机端口:容器端口 (最常用的写法、不加的话默认是随机端口。)
[root@docker01 ~]# docker run -d -it -p 80:80 nginx:latest
-p 宿主机ip1:宿主机端口:容器端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:90:80 nginx:latest
应用场景:
一般宿主机会有多块网卡,每块网卡都可以有一个ip地址
添加一块辅助网卡:
[root@docker01 ~]# ifconfig eth0:1 10.0.0.10/24 up
[root@docker01 ~]# docker run -d -p 10.0.0.10:80:80 nginx:latest
[root@docker01 ~]# docker run -d -p 10.0.0.11:80:80 nginx:latest
-p 宿主机ip1::容器端口 宿主机随机端口映射至容器80端口
[root@docker01 ~]# docker run -d -p 10.0.0.11::80 nginx:latest
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
[root@docker01 ~]# docker run -d -p 10.0.0.11::80/udp nginx:latest
-p 81:80 -p 1022:22 指定多个端口映射
[root@docker01 ~]# docker run -d -it -p 81:80 -p 1022:22 centos:7
-p 1111-1119:1111-1119 端口范围映射(两个范围的端口数目一致)
[root@docker01 ~]# docker run -d -it -p 100-110:90-100 centos:7
-P(大写的) 自动随机端口映射
[root@docker01 ~]# docker run -d -it -P nginx:latest

4.docker数据卷
1.现在我们都可以随便起一个容器了,那么我们能用容器来干什么?启动nginx的容器也只能访问默认页面,那么我们如何在站点里面写入数据呢?
2.启动nginx容器并进入到容器里
[root@docker01 ~]# docker run -d -it -p 80:80 nginx:latest
[root@docker01 ~]# docker exec -it nostalgic_jones /bin/bash
root@ef51ac01f6c8:/# cd /usr/share/nginx/html/
root@ef51ac01f6c8:/usr/share/nginx/html# touch sfy.txt
root@ef51ac01f6c8:/usr/share/nginx/html# ls
50x.html index.html sfy.txt
3.在宿主机上查找sfy.txt,就可以知道容器的数据具体存放路径了
[root@docker01 ~]# find / -name "sfy.txt"
[root@docker01 ~]# cd /var/lib/docker/overlay2/1752ddeebf3883f65d728d5ee0f78cb8a9faeb86f95da11aabdcbb72dead42b8/merged
4.上传代码文件到上面的那个路径,然后打开网页刷新
5.这种方法不推荐,我们可以使用-v挂载参数
5.1.在宿主机上创建对应的目录并上传对应的代码
[root@docker01 ~]# mkdir -p /code/xiaoniao
6.创建镜像并打开浏览器访问
[root@docker01 ~]# docker run -d -it -p 81:80 -v /code/xiaoniao:/usr/share/nginx/html nginx:latest
7.相比8.5与8.6两种方法,8.6更方便,加入更新代码,用第一种方法还需要一台一台改,而第二种方法只修改宿主机的代码就可以,有点类似共享存储
8.创建卷,将容器上的数据持久化的(永久)保存在卷上面,就算把容器删除,只要卷还在,数据就在。卷的大小看/分区的大小,卷没有大小限制。不加卷名的话会随机起一个卷名。
[root@docker01 ~]# docker volume create test
8.1.卷的默认路径
[root@docker01 ~]# cd /var/lib/docker/volumes/test/_data/
8.2.查看挂载的卷
[root@docker01 /var/lib/docker/volumes/test/_data]# docker volume ls
删除卷的命令:
[root@docker01 /var/lib/docker/volumes/test/_data]# docker volume rm test
持久化的作用:就算当前容器坏掉了,也可以启用一个新容器来恢复,只要相同的镜像挂载相同的卷就可以。如果卷下面没有数据,它会容器指定目录下的文件持久化到卷的数据目录下、如果卷下面有数据,它会把卷的数据目录挂载到容器的指定目录
docker run
-v 宿主机绝对目录:容器目录
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据,适合保存变化的数据
-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据,适合数据共享
--volumes-from #跟某一个容器挂载所有相同的卷
9.小练习: 只启动一个nginx容器,要求访问80端口,出现nginx默认欢迎首页,访问81端口,出现小鸟飞飞
方法一:
启动容器
[root@docker01 ~]# docker run -d -p 80-81:80-81 -v /code/xiaoniao:/code nginx:latest
8.9.2.进入容器
[root@docker01 ~]# docker exec -it focused_meninsky /bin/bash
8.9.3.写入配置文件
root@59e9a1e697fd:/etc/nginx/conf.d# cat >> xiaoniao.conf<< EOF
server {
listen 81;
server_name localhost;
location / {
root /code;
index index.html index.htm;
}
}
EOF
8.9.4.退出并重启容器
[root@docker01 ~]# docker restart musing_blackburn
方法二
#创建新的容器
[root@docker01 ~]# docker run -d -p 82-83:80-81 -v /code/xiaoniao:/code nginx:latest
#复制粘贴
[root@docker01 ~]# cat >> xiaoniao.conf<< EOF
server {
listen 81;
server_name localhost;
location / {
root /code;
index index.html index.htm;
}
}
EOF
#拷贝文件至新的容器机上的/etc/nginx/conf.d/下面
[root@docker01 ~]# docker container cp xiaoniao.conf 9b436f03de39:/etc/nginx/conf.d
验证:(自信点,不需要验证,直接打开浏览器访问)
[root@docker01 ~]# docker exec -it wizardly_mcclintock /bin/bash
root@9b436f03de39:~# ls /etc/nginx/conf.d/xiaoniao.conf
/etc/nginx/conf.d/xiaoniao.conf
重启容器
[root@docker01 ~]# docker restart flamboyant_aryabhata
#接下来打开浏览器测试
方法三:(一条命令解决)
[root@docker01 ~]# docker run -d -p 84-85:80-81 -v /root/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /code/xiaoniao:/code nginx:latest
#挂载的时候注意!目录对应目录,文件对应文件
未经允许不得转载:孙某某的运维之路 » 2.docker容器技术的常用指令
评论已关闭