启动一个运行httpd服务的容器:
docker run -it --name=c3 centos:latest /bin/bash
在容器中安装apache服务:
yum install -y httpd
在这个过程中遇到一个问题:
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
解决方法是:
cd /etc/yum.repos.d/sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*yum makecacheyum update -y
yum -y install httpd
说明:CentOS已经停止运维的问题。2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org
把容器打包,然后导入为容器镜像。
export: Export a container's filesystem as a tar archive
import: Import the contents from a tarball to create a filesystem image.
基于容器生成容器镜像:
docker export -o centos-httpd.tar c3
导出一个正在运行的容器。
docker import -m httpd centos-http.tar centos-httpd:v1
我们再查阅下docker import的帮助文档:
[root@vm1 ~]# docker import --helpUsage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]Import the contents from a tarball to create a filesystem imageAliases:docker image import, docker importOptions:-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@vm1 ~]#
说明:
1)-m string: -m 后面的字符串不需要加引号,直接写字符串信息即可。
2)docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import后面跟选项,然后是file,就是tar包文件,然后后面是仓库也就是镜像容器名,然后后面是tag标签的内容。
然后查看下这个镜像:
[root@vm1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-httpd v1 a769afc16a9e 4 minutes ago 351MB
centos latest 5d0da3dc9764 21 months ago 231MB
[root@vm1 ~]#
[root@vm1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-httpd v1 a769afc16a9e 5 minutes ago 351MB
centos latest 5d0da3dc9764 21 months ago 231MB
[root@vm1 ~]#
[root@vm1 ~]#
history: Show the history of an image.
显示镜像历史,-m 可以显示镜像被修改了多少次。
[root@vm1 ~]# docker history centos-httpd:v1
IMAGE CREATED CREATED BY SIZE COMMENT
a769afc16a9e 6 minutes ago 351MB httpd
[root@vm1 ~]#
说明:这个COMMENT列,就是-m选项得到的结果。
再启动一个容器:
docker run -it --name c4 centos-httpd:v1 /bin/bash
然后在这个c4容器里面启动httpd:
httpd -k start
然后再进行测试:
curl http://localhost
我们把一个正在运行的容器导出成为一个tar包,然后将tar包生成一个镜像。
然后以后只要把这个镜像迁移到新的机器上,然后运行容器。并得到最新的配置。不再需要进行部署工作。大大地简化我们的工作。
查看容器IP地址方法:
说明:容器默认连接的网桥。 网桥,其实也就是交换机。
运行容器,到容器中通过ip a查看容器的IP地址:
[root@34fff4aa78a7 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
容器的IP地址由docker0网桥分配。
该地址是动态分配的。
[root@vm1 ~]# docker exec -it c3 /bin/bash
[root@b5798b7a99a3 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
inspect: Return low-level information on Docker Object.
容器就属于docker object(docker 对象)。inspect可以看到容器的所有信息。
docker inspect c2
"Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "bf746123c6c7b4bbc85ac0f29ff78c02eb524838112bd13191d011cf850b9483","EndpointID": "6f991abf587fa673ff8ccbf718981cd2869ac0b15bf691772736a84252721fc1","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null}
其中Gateway:网关。
IPAddress:172.17.0.3就是容器的IP地址。
第三种方法:
exec : Run a command in a running container(在一个正在运行的容器中运行一个命令。)
docker exec c2 ip a
在一个正在运行的容器c2中运行ip a命令。
[root@vm1 ~]# docker exec c2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever