文章目录

  • 容器查看
  • 查看运行中的容器
  • 查看所有容器【含未运行中的】
  • 查看容器运行状态
  • 查看容器属性【代码】
  • docker参数说明
  • docker run 参数说明
  • 容器创建及使用
  • 创建一个最简单的容器
  • 删除一个已创建的容器
  • 删除所有容器
  • 创建一个带终端的容器
  • 一次性容器
  • 一直运行的容器【含重新进入容器】
  • 创建一个退出容器后自动删除的容器
  • 创建自定义cmd的容器
  • 创建指定端口的容器【含端口映射】
  • 不指定映射端口号
  • 指定映射端口号
  • 创建指定变量的容器
  • 设置自定义变量
  • 通过变量指定参数
  • 不进入容器执行命令及给容器新增bash进程
  • 不进入容器执行命令
  • 给容器新增bash进程
  • 容器的停止启动操作
  • 停止一个容器
  • 启动或重启一个的容器
  • 容器和主机间文件互相拷贝
  • 主机拷贝文件到容器
  • 容器文件拷贝到主机
  • docker日志查看
  • 查看之前的日志
  • 动态查看日志
  • 容器的排错思路


容器查看

查看运行中的容器

  • 命令:docker ps 我里面没有运行任何容器,所以是空的
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#

查看所有容器【含未运行中的】

  • 命令:docker ps -a 我里面没有运行任何容器,所以是空的
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#

查看容器运行状态

  • 命令:docker top NAMES【docker ps 查看NAMES】
    这个里面有这个容器的详细信息,包括运行时间啦这些,但我们平常看里面的CMD运行的是什么居多。
[root@ccx ~]# docker top db
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             34719               34699               1                   17:51               pts/4               00:00:00            /bin/bash /usr/local/bin/docker-entrypoint.sh mysqld
polkitd             34779               34719               99                  17:51               pts/4               00:00:06            mysqld --initialize-insecure
[root@ccx ~]#

查看容器属性【代码】

  • 命令:docker inspect NAMES【docker ps 查看NAMES】
    这个命令查看到的内容是容器的底层代码,底层代码的作用就不做描述了,后面会经常用到这个命令查看属性的。
  • 我这以通过底层查看容器IP的方式展示下
[root@ccx ~]# docker inspect db | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.2",
[root@ccx ~]#
  • 下面是一个容器的默认全部底层代码,可以看看
[root@ccx ~]# docker inspect db
[
    {
        "Id": "e3f4ca9e2486b90cc95fece843c8772fa58d5acfc94ca21c78ebe3b1c28bcb2e",
        "Created": "2021-06-18T01:52:55.177573842Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "mysqld"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23305,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-06-18T01:52:55.532846553Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:9e64176cd8a206f88336506fe52cd8f87423147dc197d0250175dddc39465e90",
        "ResolvConfPath": "/var/lib/docker/containers/e3f4ca9e2486b90cc95fece843c8772fa58d5acfc94ca21c78ebe3b1c28bcb2e/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/e3f4ca9e2486b90cc95fece843c8772fa58d5acfc94ca21c78ebe3b1c28bcb2e/hostname",
        "HostsPath": "/var/lib/docker/containers/e3f4ca9e2486b90cc95fece843c8772fa58d5acfc94ca21c78ebe3b1c28bcb2e/hosts",
        "LogPath": "",
        "Name": "/db",
        "RestartCount": 0,
        "Driver": "overlay2",
        "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c796,c964",
        "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c796,c964",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "journald",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "docker-runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/8ed192638e890747cf70feb4df9b346ffb790a95c4f15b35913fca2e426c7006-init/diff:/var/lib/docker/overlay2/9f169b39dbf27e6bb47c9977c0a108c7956a2e228010b8376a2f55fa996dc15c/diff:/var/lib/docker/overlay2/5e9029a95df77de463ef9269a0b4ec52dc44c8b8befcac3cec9b2c0dc86904e4/diff:/var/lib/docker/overlay2/73d981abdeda246ebd26897c56a5f5f56466dfdf1f636bfe1bf76fd2ca3ece4a/diff:/var/lib/docker/overlay2/d9e27b7ce66aa598750f15e7ac8af9a596ad13b84d44973cf4beb2a7398b4b66/diff:/var/lib/docker/overlay2/00835e558036dafe56792056d4f972d555346639d319bec8223ed32dd5c4ded3/diff:/var/lib/docker/overlay2/4c709162fb4ebb73c84cd1b49276f50cdf49b512e0ac5b1ce5f376ba2cbe01d3/diff:/var/lib/docker/overlay2/798b82941f0407a72167d18ac0b47b873271cd43d6af3edb93cf190e7d5772ee/diff:/var/lib/docker/overlay2/aa593048918a930d13919fcbe450d6a42867aa5aef84aa126d8be6aa329d7e4b/diff:/var/lib/docker/overlay2/39dffddde3d37bded76d68ba1026034a0128663f877a7df82a38b32e72316902/diff:/var/lib/docker/overlay2/1881a218b3afb6e879db7f9ab2b4c59dc4ed2cea82a54983670a2e64fc5c5dbf/diff:/var/lib/docker/overlay2/a2f3f18b577f7bbe72a04b6a4552989ba92425654e40f7275dc3c7737b89222a/diff",
                "MergedDir": "/var/lib/docker/overlay2/8ed192638e890747cf70feb4df9b346ffb790a95c4f15b35913fca2e426c7006/merged",
                "UpperDir": "/var/lib/docker/overlay2/8ed192638e890747cf70feb4df9b346ffb790a95c4f15b35913fca2e426c7006/diff",
                "WorkDir": "/var/lib/docker/overlay2/8ed192638e890747cf70feb4df9b346ffb790a95c4f15b35913fca2e426c7006/work"
            }
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "bfd01afaff30e2040931a49fa46b7b118448e92f52bae935162dcff9fe973a7c",
                "Source": "/var/lib/docker/volumes/bfd01afaff30e2040931a49fa46b7b118448e92f52bae935162dcff9fe973a7c/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "e3f4ca9e2486",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "MYSQL_ROOT_PASSWORD=passwd",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.7",
                "MYSQL_MAJOR=5.7",
                "MYSQL_VERSION=5.7.18-1debian8"
            ],
            "Cmd": [
                "mysqld"
            ],
            "ArgsEscaped": true,
            "Image": "hub.c.163.com/library/mysql",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "6e0d9e9be9cedec3320f329bc20e63511a533eca962e37bd7670d9feca162ecc",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "3306/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/6e0d9e9be9ce",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "9bb1d214046771a79cd61942e4ebc7a1b6ebc8cc34712a1d50d662f4c8529891",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "44088b20045266ff36b1054608dbae06239eb573d66da6909eb2e0f36bb792cd",
                    "EndpointID": "9bb1d214046771a79cd61942e4ebc7a1b6ebc8cc34712a1d50d662f4c8529891",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
    }
]
[root@ccx ~]#

docker参数说明

  • 获取命令帮助:docker --help 下面是对一些参数做一些说明
    使用方式,直接跟在docker后面

参数

说明

–api-cors-header=

开放远程API调用的CORS头信息。这个接口开关对想进行二次开发的上层应用提供了支持

-b, --bridge=

挂载以存在的网桥设备到Docker容器里。注意,使用none可以停用容器里的网络

–bip=

使用CIDR地址来设定网桥的IP。注意,此参数和-b不能一起使用

-D, --debug=false

开启Debug模式。如docker -d -D

-d, --daemon=false

开启Daemon模式

–default-gateway=

容器默认网关IPv4地址

–default-gateway=

容器默认网关IPv4地址

–default-gateway-v6=

容器默认网关IPv6地址

–default-ulimit=[]

容器设置默认ulimits

–dns=[]

强制容器使用DNS服务器。例如:docker -d --dns 8.8.8.8

–dns-search=[]

强制容器使用指定的DNS搜索域名。例如:docker -d --dns-search example.com

-e, --exec-driver=native

强制容器使用指定的运行时驱动。例如:docker -d -e lxc

–exec-opt=[]

设置执行驱动选项

–exec-root=/var/run/docker

配置docker执行驱动的根目录

–fixed-cidr=

IPv4 子网设置掩码(ex:10.20.0.0.0/16),这个子网必须嵌套于网桥子网内(由-b或者–bip定义)

–fixed-cidr-v6=

IPv6子网设置掩码

-G, --group=docker

在后台运行模式下,赋予指定的Group到相应的unix socket上。当参数–group赋予空字符串时,将去除组信息

-g, --graph=/var/lib/docker

配置Docker 运行时根目录

-H, --host=[]

在后台模式下指定socket绑定,可以绑定一个或多个tcp://host:port,unix:///path/to/socket,fd://*或fd://socketfd.例如:docker -H tcp://0.0.0.0:2375 ps

-h, --help=false

帮助

–icc=true

启用内联容器的通信

–insecure-registry=[]

对于特定注册启用非安全通信(对于HTTPS没有证书校验,启用HTTP启用fallback)

–ip=0.0.0.0

容器绑定IP时使用的默认IP地址

–ip-forward=true

启用容器的net.ipv4.ip_forward

–ip-masq=true

对于网桥的IP段启用ip伪装

–iptables=true

启用Docker容器自定义的iptable规则

–ipv6=false

启用IPv6网络

-l, --log-level=info

设置日志级别

–label=[]

为守护进程设置标签

–log-driver=json-file

默认容器驱动日志

–log-opt=map[]

设置日志驱动选项

–mtu=0

设置容器网络的MTU值,如果没有这个参数,选用默认route MTU,如果没有默认route,就设置常量值1500

-p, --pidfile=/var/run/docker.pid

后台进程PID文件路径

–registry-mirror=[]

指定优先使用的Docker registry镜像

-s, --storage-driver=

强制容器运行时使用指定的存储驱动。例如:指定使用devicemapper, docker -d -s devicemapper

–selinux-enabled=false

启用selinux支持

–storage-opt=[]

配置存储驱动的参数

–tls=false

启用TLS默认开关

–tlscacert=~/.docker/ca.pem

通过CA认证过的certificate文件路径

–tlscert=~/.docker/cert.pem

TLS的certificate文件路径

–tlskey=~/.docker/key.pem

TLS的key文件路径

–tlsverify=false

使用TLS并做后台进程与客户端通讯的验证

–userland-proxy=true

回路使用用户代理

-v, --version=false

显示版本信息

docker run 参数说明

  • 使用方式:放在 docker run后面

参数

说明

-a=map[]

附加标准输入、输出或者错误输出

-c=0

共享CPU格式(相对重要)

-cidfile="":

将容器的ID标识写入文件

-d=false

分离模式,在后台运行容器,并且打印出容器ID

-e=[]

设置环境变量

-h=""

容器的主机名称

-i=false

保持输入流开放即使没有附加输入流

-privileged=false

给容器扩展的权限

-m=""

内存限制 (格式:, unit单位 = b, k, m or g)

-n=true

允许镜像使用网络

-p=

匹配镜像内的网络端口号,端口映射也是-p,格式是 -p 物理端口:容器端口

-rm=false

当容器退出时自动删除容器 (不能跟 -d一起使用)

-t=false

分配一个伪造的终端输入

-u=""

用户名或者ID

-dns=[]

自定义容器的DNS服务器

-v=[]

创建一个挂载绑定:[host-dir]:[container-dir]:[rw

-volumes-from=""

挂载容器所有的卷

-entrypoint=""

覆盖镜像设置默认的入口点

-w=""

工作目录内的容器

-lxc-conf=[]

添加自定义-lxc-conf=“lxc.cgroup.cpuset.cpus = 0,1”

-sig-proxy=true

代理接收所有进程信号(even in non-tty mode)

-expose=[]

让你主机没有开放的端口

-link=""

连接到另一个容器(name:alias)

-name=""

分配容器的名称,如果没有指定就会随机生成一个

-P=false

Publish all exposed ports to thehost interfaces 公布所有显示的端口主机接口

容器创建及使用

  • docker运行原理,是需要依赖一个bash【终端】进程,如果bash【终端】进程结束,那么docker也就停了,所以要让docker一直保持运行,就需要一直有一个bash【终端】进程在使用中,而这个容器就挂在在这个进程上面。
    所以每当有一个容器运行,就会产生一个bash【终端】进程。
  • 创建容器的前提是需要有镜像哈。
[root@ccx ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                   latest              d1a364dc548d        3 weeks ago         133 MB
hub.c.163.com/library/wordpress   latest              dccaeccfba36        3 years ago         406 MB
hub.c.163.com/library/centos      latest              328edcd84f1b        3 years ago         193 MB
hub.c.163.com/library/mysql       latest              9e64176cd8a2        4 years ago         407 MB
[root@ccx ~]#

创建一个最简单的容器

  • 这种方式创建的容器是没有运行的,所以只能通过docker ps -a 查看到。
    如果把进程【cmd】比喻成人的灵魂,那么容器就是人的肉体,现在仅仅是创建了人的肉体,但没有灵魂,这也肉体【容器】也就是个摆设而已。
  • 命令: docker run REPOSITORY名称【名称用docker images查看】
  • 如,我创建镜像中的centos镜像,代码如下
[root@ccx ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                   latest              d1a364dc548d        3 weeks ago         133 MB
hub.c.163.com/library/wordpress   latest              dccaeccfba36        3 years ago         406 MB
hub.c.163.com/library/centos      latest              328edcd84f1b        3 years ago         193 MB
hub.c.163.com/library/mysql       latest              9e64176cd8a2        4 years ago         407 MB
[root@ccx ~]# 
[root@ccx ~]# docker run hub.c.163.com/library/centos
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                      PORTS               NAMES
58fda0018860        hub.c.163.com/library/centos   "/bin/bash"         24 seconds ago      Exited (0) 12 seconds ago                       lucid_ardinghelli
[root@ccx ~]#

删除一个已创建的容器

  • 删除未使用中的命令:docker rm CONTAINER ID 或 NAMES【docker ps查看】
    若使用CONTAINER ID进行删除,如果运行容器少,我们可以只使用ID签2位即可【前提是该ID具有唯一辨识】
  • 如,我删除centos进程
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                      PORTS               NAMES
58fda0018860        hub.c.163.com/library/centos   "/bin/bash"         24 seconds ago      Exited (0) 12 seconds ago                       lucid_ardinghelli
[root@ccx ~]# docker rm 58
58
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#
  • 删除一个使用中的容器命令:docker rm CONTAINER ID 或 NAMES --force【- -force可以写成-f】【docker ps查看NAMES】
    force参数就是强制删除的意思
  • 如,我删除一个正在使用中的容器,如果不加参数就直接报错了,加上参数才可以正常删除
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
5a2339146b8e        hub.c.163.com/library/centos   "/bin/bash"         3 minutes ago       Up 3 minutes                            frosty_payne
[root@ccx ~]# docker rm 5a
Error response from daemon: You cannot remove a running container 5a2339146b8ef64a60e1892a1d2e1d4a0e2ce1c5d80f811d80a18e7f3f90154a. Stop the container before attempting removal or use -f
[root@ccx ~]# docker rm 5a --force
5a
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#

删除所有容器

  • 删除全部容器:docker rm -f $(docker ps -aq)【固定的】
    docker ps -aq 这是查看全部容器的con ID,所以这样就可以直接全部删除拉。
  • 如下,我有2个容器,直接一下子就全给干掉了
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e300b79fce1b        docker.io/busybox   "sh"                     9 minutes ago       Up 9 minutes                            c1
ab8cc63f0c17        docker.io/nginx     "/docker-entrypoin..."   14 minutes ago      Up 14 minutes                           web
[root@ccx ~]# docker rm -f $(docker ps -aq)
e300b79fce1b
ab8cc63f0c17
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#

创建一个带终端的容器

  • 从下面开始,就会使用到docker run 的各种参数了,对这个不清楚的,看上面的docker run 参数说明。
  • 带终端就是创建一个带模拟终端且允许交互的一个容器,在docker中,自动进入是attach
    注:带终端一般是it一起使用,如果仅仅使用d模拟终端,那么这个终端是没办法操作的,并且该终端无法停止,只能重新打开一个终端删除这个容器。

一次性容器

  • 命令:docker run -it REPOSITORY名称【名称用docker images查看】
  • 一次性容器的意思就是,当我们创建成功且进入该容器以后,如果我们exit退出容器,该容器就停止运行了,不能通过attach重新进入,需要重新启动该容器后才能attach进入,或者删除重新建。
  • 如,我创建了一个带终端且能进入交互的centos容器
    可以看到路径变成一串数字了,这是容器的终端,并且现在这个容器命令很少的,连基本的 ip a 这些命令都没。
[root@ccx ~]# docker run -it hub.c.163.com/library/centos
[root@5a2339146b8e /]# ip a 
bash: ip: command not found
[root@5a2339146b8e /]# ifconfig
bash: ifconfig: command not found
[root@5a2339146b8e /]# ls
anaconda-post.log  dev  home  lib64       media  opt   root  sbin  sys  usr
bin                etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@5a2339146b8e /]#

一直运行的容器【含重新进入容器】

  • 创建一个一直运行的容器就是创建成功后即使退出当前容器,容器状态依然是运行中,可以通过attach重新进入该容器里面
  • 查看容器是否运行的方式为:
  • 执行命令:docker ps
  • 其中有一个参数是,STATUS,下面显示的为UP即该容器在运行中
  • 创建命令:docker run -it --restart=always --name=自定义名称 REPOSITORY名称【名称用docker images查看】
    参数 --restart=always表示一直运行,但我们一般结合–name=自定义名称使用,这样方便我们再次进入时使用自定义名称,而不是系统自动生成的名称了
  • 进入正在运行的容器命令:docker attach NAMES【ps可以查看NAMES】
  • 如,我创建一个一直运行的centos容器,以及退出并重新进入操作
[root@ccx ~]# docker run -it --restart=always --name=d1 hub.c.163.com/library/centos
[root@b943f071db6b /]# ls
anaconda-post.log  dev  home  lib64       media  opt   root  sbin  sys  usr
bin                etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@b943f071db6b /]# exit #退出容器
exit
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
b943f071db6b        hub.c.163.com/library/centos   "/bin/bash"         18 seconds ago      Up 10 seconds                           d1
[root@ccx ~]# docker attach d1
[root@b943f071db6b /]# ls
anaconda-post.log  dev  home  lib64       media  opt   root  sbin  sys  usr
bin                etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@b943f071db6b /]#
  • 如果我们不想每次创建成功都进入到终端,可以加一个参数d,配合it使用就是docker run -dit ... 创建成功以后使用 docker attach NAMES进入
    如下
[root@ccx ~]# docker rm -f d1 #删除之前创建的
d1
[root@ccx ~]# docker run -dit --restart=always --name=d1 hub.c.163.com/library/centos
dcfb1bd778a2021ff2889653dc955954721c928b75a3646cb74cbfd2c19a6247
[root@ccx ~]# docker attach d1 #手动进入d1容器
[root@dcfb1bd778a2 /]# exit #退出容器
exit
[root@ccx ~]#

创建一个退出容器后自动删除的容器

  • 这个更多用于测试使用,免去了自己手动删容器的步骤
  • 参数:--rm 注:这个不能和 --restart=always共同存在。
  • 如,我创建一个centos镜像,进入后自动删除
[root@ccx ~]# docker run -it --rm --name=d1 -e ccx=hero hub.c.163.com/library/centos
[root@6ecf6a164b75 /]# echo $ccx
hero
[root@6ecf6a164b75 /]# exit
exit
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]#

创建自定义cmd的容器

  • 如果我们不指定cmd,则运行的是镜像默认的cmd,默认cmd查看命令: docker histrory 镜像名称 选项中 CMMENT内容就是默认运行的cmd了
[root@ccx ~]# docker history hub.c.163.com/library/centos | head -n 2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
328edcd84f1b        3 years ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
[root@ccx ~]#
  • 自定义cmd方式:直接在创建容器的最后面加上想运行cmd的命令即可
  • 如,我就用上面创建一个带终端的命令,让cmd变成 sleep 1000
[root@ccx ~]# docker run -dit --restart=always --name=d1 hub.c.163.com/library/centos sleep 1000
47003712cf729e77cfe464f0c991320ffab0e41562feef2e459a861b079a797b
[root@ccx ~]# 
[root@ccx ~]# docker attach d1
^C
^C

^C

# 因为在睡眠中,所以进入交互后是不能做任何操作的,必须重新打开一个终端,删掉这个容器才可以提前结束睡眠。
# 不能看到提示符的原因是,我们如果想看到提示符的话,前提是容器有有终端有shell。
# 下面内容是在一个新终端中看到的,
#可以看到状态是UP,COMMAND 的内容变成自定义了
[root@ccx ~]# docker ps 
CONTAINER ID        IMAGE                          COMMAND             CREATED              STATUS              PORTS               NAMES
47003712cf72        hub.c.163.com/library/centos   "sleep 1000"        About a minute ago   Up About a minute                       d1
[root@ccx ~]# 
[root@ccx ~]# docker rm -f d1
d1
[root@ccx ~]#

创建指定端口的容器【含端口映射】

不指定映射端口号

  • 指定端口的参数是 -p 容器端口号 【虽然nginx默认端口就是80,但如果要映射到物理端口,这个就必须加,如果不加的话就没办法自动生成物理端口映射对应容器端口】
  • 如果我们不指定物理端口号,就会自动生成一个端口号用来映射
  • 我们用nginx做一个实验
[root@ccx ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                   latest              d1a364dc548d        3 weeks ago         133 MB
hub.c.163.com/library/wordpress   latest              dccaeccfba36        3 years ago         406 MB
hub.c.163.com/library/centos      latest              328edcd84f1b        3 years ago         193 MB
hub.c.163.com/library/mysql       latest              9e64176cd8a2        4 years ago         407 MB
[root@ccx ~]# docker run -dit --name=web --restart=always -p 80 docker.io/nginx
ade92da1f9d587792f740bf62e520c099ca062b7b4003537509742f7c9c2137d
[root@ccx ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
ade92da1f9d5        docker.io/nginx     "/docker-entrypoin..."   10 seconds ago      Up 8 seconds        0.0.0.0:32769->80/tcp   web
[root@ccx ~]#
  • 上面使用docker ps可以看到PORTS中32769对应的80端口
    此时我们使用浏览器访问ip:32768【ip是运行这个容器的ip】可以看到到nginx内容了
    因为nginx未配置任何内容,所以访问后显示的是下面内容
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

指定映射端口号

  • 指定映射端口的参数是 -p 物理端口号:容器端口号
  • 注,物理端口不能和主机现有的端口冲突,比如现在想映射到物理的81端口,则在主机上执行下面命令,没有结果就证明该端口没有被占用[root@ccx ~]# netstat -ntlp | grep 81
  • 我们用nginx做一个实验
[root@ccx ~]# netstat -ntlp | grep 81
[root@ccx ~]# 
[root@ccx ~]# docker rm -f web
web
[root@ccx ~]# docker run -dit --name=web --restart=always -p 81:80 docker.io/nginx
82e3a85f1e2e4a0bf31d8d5a67aee16e1088487f565f536683c3235131e3d336
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
82e3a85f1e2e        docker.io/nginx     "/docker-entrypoin..."   6 seconds ago       Up 4 seconds        0.0.0.0:81->80/tcp   web
[root@ccx ~]#
  • 如上,我们可以看到81端口已经映射到80上了
    此时我们使用浏览器访问ip:81【ip是运行这个容器的ip】可以看到到nginx内容了
    因为nginx未配置任何内容,所以访问后显示的是下面内容
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

创建指定变量的容器

设置自定义变量

  • 参数是 -e 变量 注: 每个参数前面都需要加上 -e,多个参数有空格隔开。
  • 如,我们现在创建一个变量 a=111 b=222的容器
[root@ccx ~]# docker images| grep centos
hub.c.163.com/library/centos      latest              328edcd84f1b        3 years ago         193 MB
[root@ccx ~]# docker run -dit --restart=always --name=d1 -e a=111 -e b=222 hub.c.163.com/library/centos
952082ef20cb263a302801c0cc958945163c2cf17b35a0368388b02a16206336
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                NAMES
952082ef20cb        hub.c.163.com/library/centos   "/bin/bash"              10 seconds ago      Up 7 seconds                             d1
82e3a85f1e2e        docker.io/nginx                "/docker-entrypoin..."   4 minutes ago       Up 4 minutes        0.0.0.0:81->80/tcp   web
[root@ccx ~]# docker attach d1
[root@952082ef20cb /]# echo $a
111
[root@952082ef20cb /]# echo $b
222
[root@952082ef20cb /]#

通过变量指定参数

  • 参数是 -e 参数= 注: 每个参数前面都需要加上 -e,多个参数有空格隔开。
  • 很多镜像,都需要通过变量来指定一些参数
    你去镜像官网看的时候,有很多默认参数,如果想修改这些默认参数,就需要通过变量的方式来修改,比如 mysql
  • 参数名称查看:我们创建一个mysql的容器,我们是不知道mysql的root密码的,我们就需要通过变量来指定密码,那么我们如何知道这个镜像指定密码的参数呢?
    去镜像官网搜索你现在使用的镜像,下拉,找到Environment Variables ,下面就有对各个参数的作用及默认值做出说明==【我博客中有一篇文章为:docker镜像下载及管理的文章,里面有详细说明如何搜索docker镜像及网址这些信息】==
  • 并且mysq镜像创建的时候必须指定密码,否则该容器是无法创建成功的,现在我们就以指定mysql容器密码创建为例
[root@ccx ~]# docker run -dit --name=db -e MYSQL_ROOT_PASSWORD=passwd hub.c.163.com/library/mysql
14b470f19d9ed3185b11250af892087ace84dff301eb73049424956532b4903f
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
14b470f19d9e        hub.c.163.com/library/mysql   "docker-entrypoint..."   8 seconds ago       Up 5 seconds        3306/tcp            db

不进入容器执行命令及给容器新增bash进程

下面我以mysql容器做测试,因为mysql是一个比较特殊的镜像,她默认的cmd进程是mysqld,没有bash,所以我们不能直接进入该容器,需要先手动创建一个bash才行。

不进入容器执行命令

  • 命令:docker exec NAMES 命令【docker ps 查看NAMES】
    这个就不多做解释了,就是不进入容器执行指定命令罢了
    注:如果执行报错,是因为容器里面没有这个命令。
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
879d21c0931d        hub.c.163.com/library/mysql   "docker-entrypoint..."   8 minutes ago       Up 8 minutes        3306/tcp            db
[root@ccx ~]# docker exec db 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
41: eth0@if42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
[root@ccx ~]# 
[root@ccx ~]# docker exec db ifconfig
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:235: starting container process caused "exec: \"ifconfig\": executable file not found in $PATH"

[root@ccx ~]#

给容器新增bash进程

  • 新建bash进程和创建docker时带的参数一样,都是-it 命令:dicjer exec -it BANES 进程名称
  • 如,我给db容器新增一个bash进程
    命令:docker exec -it db bash 【注:这个是一次性的,退出候该bash就结束了,后面要重新进入,必须再次执行该命令】
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
879d21c0931d        hub.c.163.com/library/mysql   "docker-entrypoint..."   14 minutes ago      Up 14 minutes       3306/tcp            db
[root@ccx ~]# docker exec -it db bash
root@879d21c0931d:/# 
root@879d21c0931d:/# 
root@879d21c0931d:/# 
root@879d21c0931d:/# 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
41: eth0@if42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever
root@879d21c0931d:/# exit
exit
[root@ccx ~]# docker top db
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             34719               34699               0                   17:51               pts/4               00:00:04            mysqld
[root@ccx ~]#

容器的停止启动操作

我们先创建一个自动启动的容器d1

[root@ccx ~]# docker run -dit --restart=always --name=d1 hub.c.163.com/library/centos
f1881049e6fb472a4b1f6ca819d45734b231ca5adcd33f30c5b190bdee3a044d
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         8 seconds ago       Up 7 seconds                            d1
[root@ccx ~]#

停止一个容器

  • 停止命令:docker stop NAMES 【docker ps 查看names】
    注:即使在创建容器的时候添加了自动重启的参数[–restart=always],但是人为的关闭容器,她是不会再给你启动了。
  • 如,我现在关闭一个自动启动的容器d1,看status状态会发现不是run了
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Up 5 seconds                            d1
[root@ccx ~]# docker stop d1
d1
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                        PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Exited (137) 10 seconds ago                       d1
[root@ccx ~]#

启动或重启一个的容器

  • 启动命令:docker start NAMES 【docker ps 查看names】
  • 重启命令:docker restart NAMES 【docker ps 查看names】
[root@ccx ~]# docker ps -a
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                            PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Exited (137) About a minute ago                       d1
[root@ccx ~]# docker start d1
d1
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Up 2 seconds                            d1
[root@ccx ~]#
  • 这种启动是可以对一个一次性的容器生效的,就是创建时候不加restart=always这个参数,但当用attach重新进入容器退出以后该容器又停止了
[root@ccx ~]# docker run -it --name=test hub.c.163.com/library/centos
[root@214b3aca1174 /]# exit
exit
[root@ccx ~]# docker ps -a | grep test
214b3aca1174        hub.c.163.com/library/centos   "/bin/bash"         16 seconds ago      Exited (0) 11 seconds ago                       test
[root@ccx ~]# docker start test
test
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
214b3aca1174        hub.c.163.com/library/centos   "/bin/bash"         34 seconds ago      Up 8 seconds                            test
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Up About a minute                       d1
[root@ccx ~]# docker attach test
[root@214b3aca1174 /]# exit
exit
[root@ccx ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS               NAMES
f1881049e6fb        hub.c.163.com/library/centos   "/bin/bash"         15 hours ago        Up About a minute                       d1
[root@ccx ~]#

容器和主机间文件互相拷贝

我先创建一个名为db的mysql容器,做后面的测试使用

[root@ccx ~]# docker run -dit --name=db -e MYSQL_ROOT_PASSWORD=passwd hub.c.163.com/library/mysql
e3f4ca9e2486b90cc95fece843c8772fa58d5acfc94ca21c78ebe3b1c28bcb2e
[root@ccx ~]#

主机拷贝文件到容器

  • 命令:docker cp 主机文件 容器名:容器存放路径
  • 如我将本机的/etc/issue文件拷贝到db容器中的/tmp中
[root@ccx ~]# docker exec db ls /tmp
[root@ccx ~]# docker cp /etc/issue db:/tmp
[root@ccx ~]# docker exec db ls /tmp
issue
[root@ccx ~]#

容器文件拷贝到主机

  • 命令:docker cp 容器名:文件 主机路径
  • 如:我将容器的/etc/hosts文件拷贝到主机的当前路径
[root@ccx ~]# ls | grep hosts
[root@ccx ~]# docker cp db:/etc/hosts .
[root@ccx ~]# ls | grep hosts
hosts
[root@ccx ~]# cat hosts 
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      e3f4ca9e2486
[root@ccx ~]#

docker日志查看

查看之前的日志

  • 命令: docker logs NAMES 【docker ps查看names】
  • 如:我们现在创建一个不指定密码的mysql镜像,这时候创建的镜像是有问题的,我们就可以通过日志查看报错内容
    如下代码,我们可以看到该镜像报错的原因是没有指定密码
[root@ccx ~]# docker run -dit --name=db hub.c.163.com/library/mysql
cc73e818141f2c0877863b7823f80b144a75b17646087b11dc87accad6830b18
[root@ccx ~]# docker attach db
You cannot attach to a stopped container, start it first
[root@ccx ~]# docker logs db
error: database is uninitialized and password option is not specified 
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
[root@ccx ~]#

动态查看日志

  • 命令:docker logs -f NAMES【docker ps查看names】
    注:这种情况需要2个终端,一个终端执行上面的动态查看日志命令,另一个终端对容器进行操作,然后容器的日志就会动态显示出来了

容器的排错思路

如果容器启动不起来,或者运行错误这些,排错思路就是看日志,最好是看动态日志。