天天看点

Docker 常用命令整理容器镜像坑

容器

docker run ubuntu:18.04 echo hello docker

表示用18.04的ubuntu镜像新建一个容器,用这个容器来执行echo命令

  • docker run -i -t ubuntu [bash]

    表示一个运行一个最新的ubuntu容器,并且进入到这个容器的bash中(不加i虽然可以进入bash,但是不可交互)。退出容器用

    exit

    ctrl+D

    (退出时会关闭&不删除容器)
  • docker run -i -t -d ubuntu

    容器后台运行,运行时的输出不会出现在宿主机的控制台上
  • docker run --name containerName -it ubuntu bash

    指定容器的名称
  • docker ps

    查看正在运行的容器
    • -a

      : 查看所有容器,包括已经创建但是不在运行中的容器
  • docker logs <id/name>

    查看后台运行的容器的输出
  • docker start id/name

    启动一个已经停止的容器
  • docker stop id/name

    停止一个容器
  • docker top name

    查看容器内部运行的进程
  • docker inspect name

    查看容器的配置和状态

进入后台运行的容器

  • docker attach

    从容器中退出时,容器也会停止
  • docker exec

    不会导致容器的停止
  • docker restart [-t seconds] id

    重启正在运行的容器,

    -t

    表示等待的时间(秒)

docker run -d --name containerTest3 ubuntu:18.04

docker run -itd --name containerTest2 ubuntu:18.04

效果不一样,前者创建后就被停止了,后者在后台保持运行状态

容器的导入和导出

导出容器的状态,导入后变成镜像,不会保存原始镜像的layer信息。

导出容器

  • docker export containerid> ubuntu.tar

导入容器

  • cat ubuntu.tar | docker import - mysystem:mytag

    : 导入成了一个image,可以用

    docker images

    查看,
  • docker import dockertest.tar -- centos:tag

  • docker import - 容器:tag < fileName.tar

    : windows下可以这样导入
[[email protected] ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac

[[email protected] ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysystem            tags                1c174e9fbdee        8 seconds ago       64.2MB
ubuntu              18.04               2eb2d388e1a2        6 days ago          64.2MB
nginx               latest              8cf1bfb43ff5        9 days ago          132MB
training/webapp     latest              6fae60ef3446        5 years ago         349MB
           

删除容器

删除容器时容器必须已经是关闭状态

  • docker rm -f id

  • docker container prune

    清理掉所有终止状态的容器

容器连接

端口映射

  • docker run -d -P training/webapp python app.py

    映射到主机的随机端口(大P)
  • docker run -d -p 5000:5000 training/webapp python app.py

    自行指定端口(小p)
  • docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

    指定主机的网络地址,将

    127.0.0.1:5001

    映射到容器的5000端口
  • docker port name [port]

    : 查看映射关系
  • run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

    绑定udp端口需要再端口后加上

    /udp

容器互联

新建网络

[[email protected] ~]$ docker network --help
Usage:  docker network COMMAND
Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
           
  • docker network create -d bridge test-net

    建立一个网络
    • -d

      : 指定网络类型,

      bridge、overlay

运行一个容器并连接到新建的

test-net

网络:

  • docker run -itd --name netSlave1 --network testNet twilight/nginx:ali

打开新的终端,再运行一个容器并加入到 test-net 网络:

  • docker run -itd --name netSlave2 --network testNet twilight/nginx:ali

安装

ping

:

apt-get update
apt install iputils-ping
           

ping netSlave2

竟然直接ping了name(hostname是他的id, 他的hosts文件中记录了另一个容器的ip)

配置DNS

在宿主机的 /etc/docker/daemon.json 文件增加一下内容:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}
           

重启生效,DNS会被应用到所有容器上

docker run -it --rm ubuntu cat etc/resolv.conf
[email protected]:/# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.114
nameserver 8.8.8.8
           

手动指定容器的DNS:

docker run -it --hostname slavehostname --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[[email protected] docker]# docker run -it --hostname slavehostname  --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[email protected]:/# cat /etc/resolv.conf 
search localdomain
nameserver 114.114.114.114
           

参数说明:

  • -h HOSTNAME

    --hostname=HOSTNAME

    : 设定容器的主机名,它会被写到容器内的

    /etc/hostname

    /etc/hosts

  • --dns=IP_ADDRESS

    : 添加 DNS 服务器到容器的

    /etc/resolv.conf

    中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
  • --dns-search=DOMAIN

    : 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索

    host.example.com

如果在容器启动时没有指定

--dns

--dns-search,Docker

会默认用宿主主机上的

/etc/resolv.conf

来配置容器的 DNS。

镜像

  • docker images

    列出本地的所有镜像
  • docker pull

    下载镜像
  • docker search ""

    查找相关的镜像,或者在

    http://hub.docker.com

    查看
  • docker rmi 镜像:tag

    删除镜像
  • docker tag oldenv:tag 用户名/newenv:newtag

    创建一个新的镜像,旧的镜像保留
  • docker push 用户名/newenv:newtag

    推送自己的镜像到hub上,镜像的名字必须是

    用户名/envname:tag

创建镜像

把容器导出成镜像

  • docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

    提交一个容器成为镜像
    • -m

      : 提交的描述信息
    • -a

      : 指定镜像作者
    • e218edb10161

      :容器 ID
    • runoob/ubuntu:v2

      : 指定要创建的目标镜像名
  • docker images

    可以查看到提交的镜像,和容器的导入效果一样的
[[email protected] ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2

[[email protected] ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
twilight/nginx      ali                 378d7ca4a813        8 seconds ago       229MB
mysystem            tags                1c174e9fbdee        4 minutes ago       64.2MB
ubuntu              18.04               2eb2d388e1a2        6 days ago          64.2MB
nginx               latest              8cf1bfb43ff5        9 days ago          132MB
training/webapp     latest              6fae60ef3446        5 years ago         349MB
           

导出&导入镜像到文件

导出镜像的所有信息,导入后的镜像和原有的镜像一致。(注意与导出容器的区别)

  • docker save centos:self -o centos.tar

    导出镜像到文件
  • docker load -i imagedata.tar

    导入文件成镜像
  • 可与

    docker commit containerid imagename:tag

    配合使用

从零构建镜像

Dockerfile中每一行都产生一个层都有一个id,可能多个容器之间会共享一些层,可以节省资源。

  • docker build

    : 构建一个镜像,需要一个

    Dockerfile

    文件
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
           
  • docker build -t runoob/centos:6.7 .

    创建一个镜像
    • -t

      : 表示目标镜像名
    • .

      : 表示Dockerfile文件所在的目录

自带的ubuntu会因为缺少证书而无法更新源,只能先用旧的源安装上缺少的证书

The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 3B4FE6ACC0B21F32
[email protected]:/etc/apt# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
Executing: /tmp/apt-key-gpghome.SysU7qEDMN/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
gpg: key 3B4FE6ACC0B21F32: public key "Ubuntu Archive Automatic Signing Key (2012) <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1