Docker 常用命令整理

容器

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

  • docker run -i -t ubuntu [bash] 表示一个运行一个最新的ubuntu容器,并且进入到这个容器的bash中(不加i虽然可以进入bash,但是不可交互)。退出容器用exitctrl+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.04docker 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下可以这样导入
[wangchao@localhost ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac

[wangchao@localhost ~]$ 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

容器互联

新建网络

  1. 建立一个网络:
[twilight@localhost ~]$ 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 networkName
  • -d : 指定网络类型, 网络类型分为bridgehostbridge 就是以宿主机为网关建立一个新的局域网。 host 表示虚拟机共享主机的网络,所有端口的使用状态也会共享,因此要考虑到端口占用的情况。
  1. 将容器和网络关联
# 新建一个容器,并关联到指定的网络上。
docker run -itd --name netSlave1 --network networkName iamgeName:tag

# 将一个已有的容器关联到指定网络上。
docker network connect networkName containerName
  1. 将容器和网络断开
# 将某个容器从特定网络中移除
docker network disconnect networkName containerName
  1. 查看网络的信息,可以查看到网络的网关、掩码、网络内的设备IP等:
docker network inspect networkName
  1. 安装 ping,很多镜像中不包含 ping 命令,可以使用如下命令安装 ping:
apt-get update
apt install iputils-ping
  1. 删除网络:
# 需要先断开所有容器。如果还有容器连接到这个网络,那么将无法删除。
docker network rm networkName
  1. 如果使用自定义的 network, 那么同一个网络内的容器之间是可以直接使用容器名称进行通信的。也就是可以直接 ping containerName

配置DNS

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

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

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

docker run -it --rm ubuntu cat etc/resolv.conf

root@1718bc16f2e6:/# 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

[root@localhost docker]# docker run -it --hostname slavehostname  --dns=114.114.114.114 ubuntu:18.04 /bin/bash
root@slavehostname:/# 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 可以查看到提交的镜像,和容器的导入效果一样的

[wangchao@localhost ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2

[wangchao@localhost ~]$ 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 "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"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

root@e6547d259b8f:/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) <ftpmaster@ubuntu.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
posted @ 2020-07-31 17:43  twilight0402  阅读(233)  评论(0编辑  收藏  举报