容器之王--Docker的部署及基本操作演练
1.2 部署docker
1.2.1 容器工作方法

1.2.2 部署第一个容器
官方站点:https://docs.docker.com/
1.2.2.1 配置软件仓库
]# cd /etc/yum.repos.d
]# vim docker.repo
[docker]
name = docker-ce
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable
gpgcheck = 0
1.2.2.2 安装docker-ce并启动服务
# 删除红帽自带docker工具
[root@docker-node1 ~]# rpm -qa | grep podman
podman-4.6.1-5.el9.x86_64
cockpit-podman-76-1.el9_3.noarch
[root@docker-node1 ~]# rm -f podman-4.6.1-5.el9.x86_64
[root@docker-node1 ~]# rm -f cockpit-podman-76-1.el9_3.noarch
# 以下跟实验步骤没有关系:
# 这里介绍一下:如果想在虚拟机下载好的东西打包并发送给windows可以根据我以下的方法:
[root@docker-node2 ~]# dnf download --resolve docker-ce --downloaddir=/mnt # --resolve 下载主包及所有依赖 --downloaddir= 下载到指定路径 [root@docker-node2 ~]# cd /mnt
[root@docker-node2 mnt]# ls
containerd.io-1.7.27-3.1.el9.x86_64.rpm docker-ce-cli-28.3.3-1.el9.x86_64.rpm
docker-buildx-plugin-0.26.1-1.el9.x86_64.rpm docker-ce-rootless-extras-28.3.3-1.el9.x86_64.rpm
docker-ce-28.3.3-1.el9.x86_64.rpm docker-compose-plugin-2.39.1-1.el9.x86_64.rpm[root@docker-node2 mnt]# mkdir docker
[root@docker-node2 mnt]# mv *.rpm docker
[root@docker-node2 mnt]# ls
docker[root@docker-node2 mnt]# tar zcf docker.tar.gz docker/
[root@docker-node2 mnt]# ls
docker docker.tar.gz# 此时可以使用sftp技术进行传输到windows上
# 安装docker(或者解压自己的并dnf install *.rpm 即可至/mnt)
# 记得tar完之后要下载install
# [root@docker-harbor mnt]# ls
# docker docker.tar.gz packages packages.zip
# [root@docker-harbor mnt]# cd docker/
#
# [root@docker-harbor docker]# yum install *.rpm]# yum install -y docker-ce# 编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true[root@docker-node1 ~]# systemctl daemon-reload
[root@docker-node1 ~]# systemctl restart docker[root@docker-node1 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@docker-node1 ~]# sysctl -p
net.ipv4.ip_forward = 1]# systemctl enable --now docker
]# docker info
1.2.2.3 激活内核网络选项
(企业9不需要做,企业7需要做)
]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
]# modprobe br_netfilter
]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1]# sysctl --system
]# systemctl restart docker
2.Docker的基本操作
2.1 Docker镜像管理
2.1.1 搜索镜像
[root@Docker-node1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20094 [OK]
@@@省略内容
参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
2.1.2 拉取镜像
# 从镜像仓库中拉取镜像
[root@Docker-node1 ~]# docker pull busybox
[root@Docker-node1 ~]# docker pull nginx:1.26-alpine# 查看本地镜像
[root@Docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 900dca2a61f5 7 weeks ago 188MB
nginx 1.26-alpine b32ed582bddb 7 weeks ago 43.2MB
ubuntu latest 35a88802559d 2 months ago 78.1MB
busybox latest 65ad0d468eb1 15 months ago 4.26MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
centos latest 5d0da3dc9764 2 years ago 231MB
gcr.io/distroless/base-debian12 latest 7273f3276b21 N/A 20.7MB
gcr.io/distroless/base-debian11 latest 2a6de77407bf N/A 20.6MB
[!NOTE]
alpine 版本:nginx镜像的最小安装发型版本
2.1.3 查看镜像信息
[root@Docker-node1 ~]# docker image inspect nginx:1.26-alpine
2.1.4 导入与导出镜像
[root@docker-node1 mnt]# cd packages/
[root@docker-node1 packages]# ls[root@docker-node1 packages]# docker load -i busybox-latest.tar.gz
d51af96cf93e: Loading layer [==================================================>] 4.495MB/4.495MB
Loaded image: busybox:latest
[root@docker-node1 packages]# cd
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 65ad0d468eb1 2 years ago 4.26MB
# 保存镜像
[root@Docker-node1 ~]# docker image save nginx:latest -o nginx-latest.tar.gz
[root@Docker-node1 ~]# docker image save nginx:latest nginx:1.26-alpine -o nginx.tag.gz# 保存所有镜像
[root@Docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz
[!NOTE]
- -o:指定导出镜像的位置;
- 可以同时导出多个镜像到一个文件中;
- 指定.tar.gz 可以导出并压缩。
2.1.5 删除镜像
[root@Docker-node1 ~]# docker rmi nginx:latest[root@Docker-node1 ~]# docker rmi `docker images | awk 'NR>1{print $1":"$2}'`
2.2 容器的常用操作
2.2.1 启动容器
[root@docker-node1 ~]# docker load -i /mnt/packages/mario.tar.gz[root@docker-node1 ~]# docker load -i /mnt/packages/centos-7.tar.gz[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 eeb6ee3f44bd 3 years ago 204MB
timinglee/mario latest 9a35a9e43e8c 9 years ago 198MB[root@Docker-node1 ~]# docker run -d --name mario -p 2222:8080 timinglee/mario
# 可以在浏览器中测试172.25.254.10:2222,如下图所示[root@Docker-node1 ~]# docker run -it --name centos7 centos:7
[root@3ba22e59734f /]# #进入到容器中,按<ctrl>+<d>退出并停止容器,#按<ctrl>+<pq>退出但不停止容器# 重新进入容器
[root@docker-node1 ~]# docker attach centos-7
[root@e5b52a8ec38e ~]# exit # 直接退出
exit#在容器中执行命令
[root@docker ~]# docker exec -it test ifconfig
lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

-d # 后台运行
-i # 交互式运行
-t # 打开一个终端
--name # 指定容器名称
-p # 端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm # 容器停止自动删除容器
--network # 指定容器使用的网络
2.2.2 查看容器运行信息
[root@Docker-node1 ~]# docker ps # 查看当前运行容器
[root@Docker-node1 ~]# docker ps -a # 查看所有容器
[root@Docker-node1 ~]# docker inspect busybox # 查看容器运行的详细信息
2.2.3 停止和运行容器
[root@Docker-node1 ~]# docker stop busybox # 停止容器
[root@Docker-node1 ~]# docker kill busybox # 杀死容器,可以使用信号
[root@Docker-node1 ~]# docker start busybox # 开启停止的容器
[!NOTE]
容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
2.2.4 删除容器
[root@Docker-node1 ~]# docker rm centos7 #删除停止的容器[root@Docker-node1 ~]# docker rm -f busybox #删除运行的容器[root@Docker-node1 ~]# docker container prune -f #删除所有停止的容器
2.2.5 容器内容提交
默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件
如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像
当我们在运行新镜像后即可看到我们提交的内容
commit操作必须在容器运行时进行提交(再开一个终端进行操作即可)
[root@Docker-node1 ~]# docker run -it --name test busybox
/ # touch leefile #在容器中建立文件
/ # ls
bin etc leefile lib64 root tmp var
dev home lib proc sys usr
/ #
[root@Docker-node1 ~]# docker rm test #删掉容器后
test
[root@Docker-node1 ~]# docker run -it --name test busybox #删掉容器后开启新的容器文件不存在
/ # ls
bin dev etc home lib lib64 proc root sys tmp usr var
/ #[root@Docker-node1 ~]# docker commit -m "add leefile" test busybox:v1
sha256:c8ff62b7480c951635acb6064acdfeb25282bd0c19cbffee0e51f3902cbfa4bd
[root@Docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v1 c8ff62b7480c 12 seconds ago 4.26MB[root@Docker-node1 ~]# docker image history busybox:v1
IMAGE CREATED CREATED BY SIZE COMMENT
c8ff62b7480c 2 minutes ago sh 17B add leefile
65ad0d468eb1 15 months ago BusyBox 1.36.1 (glibc), Debian 12 4.26MB
[!NOTE]
此方法不利于企业审计,所以不推荐使用,在企业中我们多用Dockerfile来构建镜像
2.2.6 系统中的文件和容器中的文件传输
[root@Docker-node1 ~]# docker cp test2:/leefile /mnt # 把容器中的文件复制到本机
Successfully copied 1.54kB to /mnt
[root@Docker-node1 ~]# docker cp /etc/fstab test2:/fstab # 把本机文件复制到容器中
2.2.7 查询容器内部日志
[root@Docker-node1 ~]# docker logs ...