Docker学习笔记7

启动一个运行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 makecache


yum 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 --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@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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever