1、创建一个容器并同时执行echo命令
# 快速启动一个容器执行特定的一次性命令并查看输出结果,输出结果后容器直接退出 [root@docker ~]# docker run -it --name=a0 centos:latest echo "abc" abc [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1c0c9551a19 centos:latest "echo abc" 8 seconds ago Exited (0) 7 seconds ago a0 41c9a7796fde centos:latest "/bin/bash" 19 hours ago Exited (0) 13 hours ago c0
2、删除容器
# 删除名为a0的容器 [root@docker ~]# docker rm a0 a0 # 开启容器 [root@docker ~]# docker start c0 c0 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 41c9a7796fde centos:latest "/bin/bash" 19 hours ago Up 3 seconds c0 # 由于该容器正在运行不能直接删除 [root@docker ~]# docker rm c0 Error response from daemon: cannot remove container "/c0": container is running: stop the container before removing or force remove # 使用-f选项强制移除正在运行中的容器 [root@docker ~]# docker rm -f c0 c0
3、设置远程管理
# 自己规定套接字文件的位置并通过TCP协议在所有网络接口(0.0.0.0代表监听所有IP地址)的2375端口上接受连接 [root@docker ~]# vim /etc/docker/daemon.json "hosts" : [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ] # 启动Docker服务时执行的命令为/usr/bin/dockerd,即启动Docker守护进程 [root@docker ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd # 重新加载系统的服务管理器配置 [root@docker ~]# systenctl daemon-reload # 重新启动Docker服务,使对Docker服务配置文件的修改生效 [root@docker ~]# systemctl restart docker # version用于查看指定IP地址(10.0.0.100)上的Docker版本信息;images用于查看指定IP地址上的Docker镜像列表。命令中的参数-H用于指定连接到的 Docker守护进程的地址 [root@docker ~]# docker -H10.0.0.100 varsion|images
4、docker image中pull的使用,从镜像仓库中下载镜像
[root@docker ~]# docker image --help pull Download an image from a registry [root@docker ~]# docker image pull --help Usage: docker image pull [OPTIONS] NAME[:TAG|@DIGEST] Download an image from a registry Aliases: docker image pull, docker pull Options: -a, --all-tags Download all tagged images in the repository --disable-content-trust Skip image verification (default true) --platform string Set platform if server is multi-platform capable -q, --quiet Suppress verbose output # 从仓库中拉取centos的镜像 [root@docker ~]# docker image pull -q centos # 查看本地镜像 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB
5、使用save将镜像打包
# 查看帮助文件,找到save,可以将镜像保存为一个tar包 [root@docker ~]# docker --help save Save one or more images to a tar archive (streamed to STDOUT by default) # 查看save使用方式 [root@docker ~]# docker save --help Usage: docker save [OPTIONS] IMAGE [IMAGE...] Save one or more images to a tar archive (streamed to STDOUT by default) Aliases: docker image save, docker save Options: -o, --output string Write to a file, instead of STDOUT # 查看现有镜像 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB # 打包镜像 [root@docker ~]# docker save -o centos.tar centos:latest # 可以将tar发给其他用户,也可以作为备份 [root@docker ~]# ls anaconda-ks.cfg centos.tar v
6、使用rmi删除镜像
[root@docker ~]# docker --help rm Remove one or more containers rmi Remove one or more images [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e2dbeb436db centos:latest "/bin/bash" 9 seconds ago Exited (0) 4 seconds ago c0 # 由于有容器在使用该镜像,所以不能直接删除该镜像 [root@docker ~]# docker rmi centos:latest Error response from daemon: conflict: unable to remove repository reference "centos:latest" (must force) - container 6e2dbeb436db is using its referenced image 5d0da3dc9764 # 删除容器,退出容器up状态 [root@docker ~]# docker rm c0 c0 [root@docker ~]# docker rmi centos:latest Untagged: centos:latest Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
7、使用load从tar文件中引入镜像
[root@docker ~]# docker --help load Load an image from a tar archive or STDIN [root@docker ~]# docker load --help Usage: docker load [OPTIONS] Load an image from a tar archive or STDIN Aliases: docker image load, docker load Options: -i, --input string Read from tar archive file, instead of STDIN -q, --quiet Suppress the load output [root@docker ~]# docker load -i centos.tar 74ddd0ec08fa: Loading layer 238.6MB/238.6MB Loaded image: centos:latest [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB
8、使用export封装镜像,使用import导入镜像
[root@docker ~]# docker run -it --name c0 centos:latest /bin/bash [root@5906fffd3383 /]# cd /etc/yum.repos.d [root@5906fffd3383 yum.repos.d]# rm -rf * [root@5906fffd3383 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2495 100 2495 0 0 6316 0 --:--:-- --:--:-- --:--:-- 6316 [root@5906fffd3383 yum.repos.d]# ls CentOS-Base.repo [root@5906fffd3383 yum.repos.d]# yum -y install epel [root@5906fffd3383 yum.repos.d]# yum clean all && yum makecache # 保持容器是运行状态 [root@41c9a7796fde /]# read escape sequence # 查看帮助文档 [root@docker ~]# docker --help [root@docker ~]# docker export --help Usage: docker export [OPTIONS] CONTAINER Export a container's filesystem as a tar archive Aliases: docker container export, docker export Options: -o, --output string Write to a file, instead of STDOUT # 使用指令,将容器导出为tar包 [root@docker ~]# docker export -o centos_yum.tar c0 # 查看新生成的tar包 [root@docker ~]# ls anaconda-ks.cfg centos.tar centos_yum.tar v # 查看帮助文档 [root@docker ~]# docker --help [root@docker ~]# docker import --help Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] Import the contents from a tarball to create a filesystem image Aliases: docker image import, docker import Options: -c, --change list Apply Dockerfile instruction to the created image -m, --message string Set commit message for imported image --platform string Set platform if server is multi-platform capable # 使用指令, [root@docker ~]# docker import -m yum centos_yum.tar centos:yum sha256:f3ca4715914e87e2d1527365e66775d9ab47b2a0208128e3ec52c0d45c364146 # 查看镜像 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos yum f3ca4715914e About a minute ago 326MB centos latest 5d0da3dc9764 2 years ago 231MB
练习:制作httpd镜像
[root@docker ~]# docker run -it --name c0 centos:yum1 /bin/bash [root@865090f46fbd /]# yum -y install httpd [root@865090f46fbd /]# echo "aaa" > /var/www/html/index.html [root@865090f46fbd /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message [root@c717adc1969a /]# [root@docker ~]# [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 865090f46fbd centos:yum1 "/bin/bash" 44 seconds ago Up 44 seconds c0 [root@docker ~]# docker export -o centos_httpd.tar c0 [root@docker ~]# docker import -m httpd centos_httpd.tar centos:httpd sha256:195d7f041bf5c9e17f5cfe172c85c6d2e7d11241e530e839dfe7770186296bb1 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos httpd 195d7f041bf5 13 seconds ago 268MB centos yum1 a2a0a138806b 3 hours ago 260MB centos latest 5d0da3dc9764 2 years ago 231MB [root@docker ~]# docker run -it --name c0 centos:httpd /bin/bash [root@5f6e6f840b2b /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message [root@5f6e6f840b2b /]# curl localhost hh
9、查看容器ip地址的方法
# 直接进入到容器中查看IP地址 [root@docker ~]# docker attach c1 [root@452771f307cc /]# ip addr inet 172.17.0.3/16 brd 172.17.255.255 scope # 查看容器信息,可以查看ip地址 [root@docker ~]# docker inspect c0 # 在外部调用指令,查看容器ip地址 [root@docker ~]# docker exec c1 ip a inet 172.17.0.3/16 brd 172.17.255.255 scope
练习测试:使用exec touch一个文件
[root@docker ~]# docker exec c1 touch 1.txt [root@docker ~]# docker attach c1 [root@452771f307cc /]# ls 1.txt dev home lib64 media opt root sbin sys usr bin etc lib lost+found mnt proc run srv tmp var
10、容器中虚拟端口映射
# 将容器中的80端口映射到宿主机(docker主机)的80端口 -p宿主机端口:容器端口 [root@docker ~]# docker run -it --name c2 -p80:80/tcp centos:httpd1 /bin/bash [root@5f6e6f840b2b /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message [root@5f6e6f840b2b /]# curl localhost hh [root@5f6e6f840b2b /]# [root@docker ~]# [root@docker ~]# docker inspect c2 "IPAddress": "172.17.0.4", [root@docker ~]# curl 172.17.0.4 hh # 浏览器访问宿主机的80端口
# 将容器中的80端口映射到宿主机(docker主机)的12345端口 [root@docker ~]# docker run -it --name c3 -p12345:80 centos:httpd1 /bin/bash # 需要启动服务 [root@fa074e53e1d6 /]# curl localhost curl: (7) Failed to connect to localhost port 80: Connection refused [root@fa074e53e1d6 /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.5. Set the 'ServerName' directive globally to suppress this message [root@fa074e53e1d6 /]# curl localhost hh [root@fa074e53e1d6 /]# [root@docker ~]# [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa074e53e1d6 centos:httpd1 "/bin/bash" 5 minutes ago Up 5 minutes 0.0.0.0:12345->80/tcp, :::12345->80/tcp c3 5f6e6f840b2b centos:httpd1 "/bin/bash" 13 minutes ago Up 13 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp c2 # 浏览器访问宿主机的12345端口
# 宿主机上所有端口的应用情况,防止映射端口时产生端口冲突 [root@docker ~]# less /etc/services # 停止容器 [root@docker ~]# docker stop c0 c1 c2 c3 c0 c1 c2 c3 # 删除容器 [root@docker ~]# docker rm c0 c1 c2 c3 c0 c1 c2 c3 # 随机为容器指定映射端口(映射端口大于等于32767端口) [root@docker ~]# docker run -it --name c0 -p80 centos:httpd1 /bin/bash [root@46580643be3c /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [root@46580643be3c /]# curl localhost hh [root@46580643be3c /]# [root@docker ~]# [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46580643be3c centos:httpd1 "/bin/bash" 35 seconds ago Up 34 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp c0 # 浏览器访问宿主机的32768端口
[root@docker ~]# docker run -it --name c1 -p80 centos:httpd1 /bin/bash [root@fe69a949d832 /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message [root@fe69a949d832 /]# [root@docker ~]# [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fe69a949d832 centos:httpd1 "/bin/bash" 20 seconds ago Up 19 seconds 0.0.0.0:32769->80/tcp, :::32769->80/tcp c1 46580643be3c centos:httpd1 "/bin/bash" 4 minutes ago Up 4 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp c0
11、通过宿主机中其他的ip地址的端口映射容器的端口
# 添加一块虚拟网卡 [root@docker ~]# ifconfig ens33:0 10.0.0.101 broadcast 10.0.0.101 netmask 255.255.255.255 up # 强制删除正在运行中的容器 [root@docker ~]# docker rm -f c0 c1 c0 c1 # 创建一个容器将容器的80端口映射到宿主机的10.0.0.101地址下的随机端口上 [root@docker ~]# docker run -it --name c0 -p10.0.0.101::80 centos:httpd1 /bin/bash [root@c9ea4034d9e2 /]# httpd -k start AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [root@c9ea4034d9e2 /]# curl localhost hh [root@c9ea4034d9e2 /]# [root@docker ~]# [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9ea4034d9e2 centos:httpd1 "/bin/bash" 43 seconds ago Up 43 seconds 10.0.0.101:32768->80/tcp c0 # 浏览器访问宿主机10.0.0.101的32768端口
12、容器数据持久化保存(卷映射)
因为dockers容器只是一个工具,不需要保存数据,不需要在持久化,如果要做持久化,那么就需要保存到宿主机上,需要宿主机和容器之间有一个共享卷。
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9ea4034d9e2 centos:httpd1 "/bin/bash" 23 minutes ago Up 23 minutes 10.0.0.101:32768->80/tcp c0 # 强制删除正在运行中的容器 [root@docker ~]# docker rm -f c0 c0 # 创建映射目录 [root@docker ~]# mkdir /source # 创建一个容器并将容器的/data目录映射到宿主机的/source目录上 [root@docker ~]# docker run -it --name c0 -v /source:/data centos:httpd1 /bin/bash [root@13f4660eef3e /]# ls bin dev home lib64 media opt root sbin sys usr data etc lib lost+found mnt proc run srv tmp var [root@13f4660eef3e /]# [root@docker ~]# [root@docker ~]# touch /source/hh.txt [root@docker ~]# docker exec c0 ls /data hh.txt [root@docker ~]# docker exec c0 touch /data/hehe.txt [root@docker ~]# ls /source/ hehe.txt hh.txt
13、总结:
(1)镜像的迁移
1)打包
docker save -o centos.tar centos:lstest
2)加载
docker load -i centos.tar docker images # 停用关闭容器 docker rm c0 # 删除镜像 docker rmi centos:latest
(2)创建镜像
1)创建镜像
docker run -it --name c0 centos:latest /bin/bash # 下载阿里云仓库 # clean,,makecache ctrl p q
2)容器打包
docker export -o centos_yum.tar c0
3)引入镜像
docker import -m "updata yum repo" centos_yum.tar centos:yum docker images
(3)ip网络
1)交互式
docker start c0 docker attach c0 yum -y install iproute ip a
2)inspect
docker inspect c0
3)exec
docker exec c0 yum -y install net-tools docker exec c0 ifconfig
(4)端口
1)指定端口映射
docker run -it --name c0 -p70:80 centos:httpd /bin/bash
2)随机端口映射
docker run -it --name c0 -p80 centos:httpd /bin/bash
3)指定其他ip的端口映射
ifconfig ens33:0 10.0.0.101 broadcast 10.0.0.101 netmask 255.255.255.255 up docker run -it --name c0 -p10.0.0.101::80 centos:httpd /bin/bash
(5)持久化
1)挂载
mkdir /source docker run -it --name c0 -v /source:/data sentos:httpd /bin/bash