docker学习[2]:从0开始创建一个容器

在上一篇【docker学习[1]:什么是docker?】中,简单学习了一下docker,了解到了docker的三个基本概念,既仓库、镜像、容器。那么怎么使用docker来部署我们想要的环境呢?

基本流程大概是:在docker仓库中寻找我们需要的docker镜像,使用镜像构建一个或多个容器,在容器中操作对应的环境。

docker仓库

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

搜索镜像:

你可以通过 docker search 命令来查找官方仓库中的镜像。

Usage:  docker search [OPTIONS] TERM
 
Search the Docker Hub for images
 
Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

例如以 centos 为关键词进行搜索:

[root@localhost ~]# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5085                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              119                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   104                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   74                                      [OK]
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              48                                      [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   45                                      
tutum/centos                       Simple CentOS docker image with SSH access      43                                      
gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glust…   38                                      [OK]
openshift/base-centos7             A Centos7 derived base image for Source-To-I…   37                                      
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   36                                      
centos/python-35-centos7           Platform for building and running Python 3.5…   33                                      
kinogmt/centos-ssh                 CentOS with SSH                                 25                                      [OK]
openshift/jenkins-2-centos7        A Centos7 based Jenkins v2.x image for use w…   20                                      
centos/php-56-centos7              Platform for building and running PHP 5.6 ap…   17                                      
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   10                                      
openshift/wildfly-101-centos7      A Centos7 based WildFly v10.1 image for use …   6                                       
openshift/jenkins-1-centos7        DEPRECATED: A Centos7 based Jenkins v1.x ima…   4                                       
darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
pivotaldata/centos                 Base centos, freshened up a little with a Do…   2                                       
pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile t…   2                                       
pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi…   1                                       
blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
smartentry/centos                  centos with smartentry                          0                                       [OK]
pivotaldata/centos7-build          CentosOS 7 image for GPDB compilation           0                                       
pivotaldata/centos7-test           CentosOS 7 image for GPDB testing               0

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受关注程度)、是否官方创建、是否自动创建。官方的镜像说明是官方项目组创建和维护的,automated 资源允许用户验证镜像的来源和内容。

根据是否是官方提供,可将镜像资源分为两类。一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字

还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如 ansible 用户

另外,在查找的时候通过 --filter=stars=N 参数可以指定仅显示收藏数量为 N 以上的镜像。

注册,登陆和下载镜像

你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。注册后可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录Docker Hub,通过 docker logout 退出登录。

[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don\'t have a Docker ID, head over to https://hub.docker.com to create one.
Username: 你的账号
Password: 你的密码
Login Succeeded
[root@localhost ~]# docker logout
Removing login credentials for https://index.docker.io/v1/

利用 docker pull 命令来将它下载到本地。

[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete 
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest

可以看到,执行docker pull name的时候会默认使用tag:latest(最新的镜像),也可以自己制定tag来拉取镜像,具体tag请移步各docker hub查看。

使用docker images查看本地所有的镜像。

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        3 weeks ago         202MB

镜像

想要查看所有本地镜像,使用docker images命令就可以了

[root@localhost ~]# docker images --help
 
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
 
List images
 
Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don\'t truncate output
  -q, --quiet           Only show numeric IDs
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        3 weeks ago         202MB

列表包含了 仓库名 、 标签 、 镜像 ID 、 创建时间 以及 所占用的空间

其中占用空间的体积和docker hub上的文件大小是不一样的。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而docker image 显示的是镜像下载到本地后,展开的大小,因为查看空间的时候,更关心的是本地磁盘空间占用的大小。

通过一些奇怪的手段,我们生成了一个新的自定义镜像redis-f,查看一下本地镜像看看现在出现了什么。

[root@localhost ~]# clear
[root@localhost ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis-f             latest              18e9735765eb        3 minutes ago       340MB
<none>              <none>              7356f902b3ad        3 minutes ago       340MB
<none>              <none>              651a442d6754        3 minutes ago       202MB
redis               latest              5d2989ac9711        4 days ago          95MB
centos              latest              1e1148e4cc2c        3 weeks ago         202MB

上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 none 。这个镜像原本是有镜像名和标签的,原来为centos:7.6.1810 ,随着官方镜像维护,发布了新版本后,重新 docker pull centos:7.6.1810时,centos:7.6.1810 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 none 。除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 none 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image)

删除本地镜像

如果要删除本地的镜像,可以使用 docker image rm 命令

[root@localhost ~]# docker image rm --help
 
Usage:  docker image rm [OPTIONS] IMAGE [IMAGE...]
 
Remove one or more images
 
Aliases:
  rm, rmi, remove
 
Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

可以看到,image rm 也可以简写为rm,rmi,remove,这里我们简写为rmi。其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。例如我们想删掉上面的虚悬镜像,可以使用镜像短ID:7356f902b3ad

[root@localhost ~]# docker rmi 7356f902b3ad
Error response from daemon: conflict: unable to delete 7356f902b3ad (cannot be forced) - image has dependent child images

报错,错误原因:有镜像为该镜像的子镜像(也就是后来创建的redis-f),因为虚悬镜像的特性,当删掉redis-f的时候,依赖的虚悬镜像也就一并消失了。

[root@localhost ~]# docker rmi redis-f
Untagged: redis-f:latest
Deleted: sha256:18e9735765eb4a7abb859c5bdd35ca92939c6bcc8b6cff510bb322036f1dfa6a
Deleted: sha256:7356f902b3adea561be163891189578ba489b44ad7de41c9eedf4a56a10abd17
Deleted: sha256:bf9f3ecbe41a2d43abf00fa2bff24ba9ff08125c808f168b0898be7bc1776615
Deleted: sha256:651a442d67545a6e9f41a1461c6f233f8c1e17cfb668008b2a8d94492359f76e
Deleted: sha256:3563a496e103b79423f7a04816871af59261cda2a9c51ddd5aae5eed8d97b738
[root@localhost ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              5d2989ac9711        4 days ago          95MB
centos              latest              1e1148e4cc2c        3 weeks ago         202MB

定制镜像

上面这些命令都是使用docker hub的官方镜像,我们也可以自己定制镜像,也就是Dockerfile。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。这里我们拿peter老师的Dockerfile构建redis看看

[root@localhost ~]# clear
[root@localhost ~]# cat Dockerfile 
FROM centos:latest
RUN groupadd -r redis && useradd  -r -g redis redis
RUN yum -y update &&  yum -y install epel-release && yum -y install redis && yum -y install net-tools
EXPOSE 6379

让我们来拆分一下这个Dockerfile都做了些什么

所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如PHP,nginx,redis等。如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如ubuntu 、 debian 、 centos 、 fedora 、 alpine 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。

除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch (FROM scratch)。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go

是特别适合容器微服务架构的语言的原因之一。

可以看见,这个Dockerfile是使用了centos作为基础镜像。

RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  1. shell 格式: RUN 命令 ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式

  2. exec 格式: RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式。

要注意的是,Dockerfile中每一个指令都会建立一层,在构建镜像的时候会等一层结束后commit再构建下一层。所以太多的run是无意义且臃肿的,并且Docker中的最大层数也是有限制的,多个命令应该用&&连接。

Dockerfile中还有很多其他的命令,如Dockerfile中的EXPOSE 6379就是暴露6379端口的意思。其他命令等深入学习Dockerfile的时候再说吧~

构建镜像

好了,让我们再回到之前定制的redis镜像的 Dockerfile 来。现在我们明白了这个 Dockerfile的内容,那么让我们来构建这个镜像吧。

构建镜像使用命令docker build

[root@localhost ~]# docker build --help
 
Usage:  docker build [OPTIONS] PATH | URL | -
 
Build an image from a Dockerfile
 
Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)
      --build-arg list          Set build-time variables
      --cache-from strings      Images to consider as cache sources
      --cgroup-parent string    Optional parent cgroup for the container
      --compress                Compress the build context using gzip
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int          CPU shares (relative weight)
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust   Skip image verification (default true)
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                Always remove intermediate containers
      --iidfile string          Write the image ID to the file
      --isolation string        Container isolation technology
      --label list              Set metadata for an image
  -m, --memory bytes            Memory limit
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string          Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                Do not use cache when building the image
      --pull                    Always attempt to pull a newer version of the image
  -q, --quiet                   Suppress the build output and print image ID on success
      --rm                      Remove intermediate containers after a successful build (default true)
      --security-opt strings    Security options
      --shm-size bytes          Size of /dev/shm
  -t, --tag list                Name and optionally a tag in the 'name:tag' format
      --target string           Set the target build stage to build.
      --ulimit ulimit           Ulimit options (default [])

其中最常用的参数是-t,也就是为镜像打一个tag,在Dockerfile所在目录执行命令:

[root@localhost redis]# docker build -t redis .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:latest
latest: Pulling from library/centos
a02a4930cb5d: Pull complete 
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest
 ---> 1e1148e4cc2c
Step 2/4 : RUN groupadd -r redis && useradd  -r -g redis redis
 ---> Running in 38eb752d6540
Removing intermediate container 38eb752d6540
 ---> 25adcc7f3b00
Step 3/4 : RUN yum -y update &&  yum -y install epel-release && yum -y install redis && yum -y install net-tools
 ---> Running in 53329f92c5d0
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
No packages marked for update
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
 Package                Arch             Version         Repository        Size
================================================================================
Installing:
 epel-release           noarch           7-11            extras            15 k
 
Transaction Summary
================================================================================
Install  1 Package
 
Total download size: 15 k
Installed size: 24 k
Downloading packages:
warning: /var/cache/yum/x86_64/7/extras/packages/epel-release-7-11.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for epel-release-7-11.noarch.rpm is not installed
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-6.1810.2.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : epel-release-7-11.noarch                                     1/1 
  Verifying  : epel-release-7-11.noarch                                     1/1 
 
Installed:
  epel-release.noarch 0:7-11                                                    
 
Complete!
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package redis.x86_64 0:3.2.12-2.el7 will be installed
--> Processing Dependency: logrotate for package: redis-3.2.12-2.el7.x86_64
--> Processing Dependency: libjemalloc.so.1()(64bit) for package: redis-3.2.12-2.el7.x86_64
--> Running transaction check
---> Package jemalloc.x86_64 0:3.6.0-1.el7 will be installed
---> Package logrotate.x86_64 0:3.8.6-17.el7 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
 Package            Arch            Version                 Repository     Size
================================================================================
Installing:
 redis              x86_64          3.2.12-2.el7            epel          544 k
Installing for dependencies:
 jemalloc           x86_64          3.6.0-1.el7             epel          105 k
 logrotate          x86_64          3.8.6-17.el7            base           70 k
 
Transaction Summary
================================================================================
Install  1 Package (+2 Dependent packages)
 
Total download size: 718 k
Installed size: 1.8 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/epel/packages/jemalloc-3.6.0-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Public key for jemalloc-3.6.0-1.el7.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              1.1 MB/s | 718 kB  00:00     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-11.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : jemalloc-3.6.0-1.el7.x86_64                                  1/3 
  Installing : logrotate-3.8.6-17.el7.x86_64                                2/3 
  Installing : redis-3.2.12-2.el7.x86_64                                    3/3 
  Verifying  : logrotate-3.8.6-17.el7.x86_64                                1/3 
  Verifying  : redis-3.2.12-2.el7.x86_64                                    2/3 
  Verifying  : jemalloc-3.6.0-1.el7.x86_64                                  3/3 
 
Installed:
  redis.x86_64 0:3.2.12-2.el7                                                   
 
Dependency Installed:
  jemalloc.x86_64 0:3.6.0-1.el7         logrotate.x86_64 0:3.8.6-17.el7        
 
Complete!
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.24.20131004git.el7 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
 Package         Arch         Version                          Repository  Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.24.20131004git.el7         base       306 k
 
Transaction Summary
================================================================================
Install  1 Package
 
Total download size: 306 k
Installed size: 918 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : net-tools-2.0-0.24.20131004git.el7.x86_64                    1/1 
  Verifying  : net-tools-2.0-0.24.20131004git.el7.x86_64                    1/1 
 
Installed:
  net-tools.x86_64 0:2.0-0.24.20131004git.el7                                   
 
Complete!
Removing intermediate container 53329f92c5d0
 ---> fe26baa64413
Step 4/4 : EXPOSE 6379
 ---> Running in fbf1e613956b
Removing intermediate container fbf1e613956b
 ---> 81f72d56a2fd
Successfully built 81f72d56a2fd
Successfully tagged redis:latest

在step2中,我们可以清楚的看到RUN指令启动了一个容器,执行了命令,提交并删除了这一层

Step 2/4 : RUN groupadd -r redis && useradd  -r -g redis redis
 ---> Running in 38eb752d6540
Removing intermediate container 38eb752d6540
 ---> 25adcc7f3b00

需要注意的是,docker build -t name:tag PATH 中的 PATH 不仅仅代表当前目录,在docker中,这个PATH属性代表的是镜像构建的上下文路径(Context)。

当编写Dockerfile的时候,并非所有定制都是通过RUN完成的,有一些指令比如COPY等,会对本地文件进行操作。比如我们要复制一个文件

COPY ./composer.json /app/

这并不是要复制执行 docker build 命令所在的目录下的 composer.json ,也不是复制Dockerfile 所在目录下的 composer.json ,而是复制 上下文(context) 目录下的composer.json。因此, COPY 这类指令中的源文件的路径都是相对路径。


容器操作

上面学习了一些镜像的操作,现在可以接触docker的核心,也就是容器了。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

启动容器 docker run

启动容器又两种方式,一种是新建一个容器并启动,另一种是启动已终止的容器。

新建容器并启动的命令是docker run

[root@localhost ~]# docker run --help
 
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 
Run a command in a new container
 
Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print container ID
      --detach-keys string             Override the key sequence for detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that forwards signals and reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network string                 Connect a container to a network (default "default")
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --read-only                      Mount the container's root filesystem as read only
      --restart string                 Restart policy to apply when a container exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

通过help我们得知,docker run的使用方法是docker run [设置] 镜像 [命令] [参数],尝试启动一个centos容器。

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              75115edb5ba5        12 hours ago        340MB
centos              latest              1e1148e4cc2c        4 weeks ago         202MB
[root@localhost ~]# docker run centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
e59eb9023981        centos              "/bin/bash"         42 seconds ago      Exited (0) 42 seconds ago                       suspicious_neumann

使用最简单的命令 docker run centos 就可以实例化出一个centos的容器了。但是因为没有持久化,实例化完后就直接关闭了(Exited (0) 42 seconds ago)。从上面的--help我们能看到docker run 有一个参数 -i 即使未连接,也保持stdin(输入设备)打开。试一试使用-i实例化一个容器试试

-i, --interactive                    Keep STDIN open even if not attached
[root@localhost ~]# docker run -i centos
WARNING: IPv4 forwarding is disabled. Networking will not work.

命令行停住了,当使用-i的时候我们可以在docker容器里输入命令了,试一试ls

[root@localhost ~]# docker run -i centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
ls
anaconda-post.log
bin
dev
etc
...

可以看到,ls是可以使用的,输入一个不存在的命令会输出

/bin/bash: line 7: $'w\b\bsad': command not found

可以看见命令来自/bin/bash,注意这个/bin/bash是来自docker容器的/bin/bash,并不是宿主机的bash。使用exit退出容器。

使用 -t 参数,分配一个虚拟的控制台。

 -t, --tty                            Allocate a pseudo-TTY
[root@localhost ~]# docker run -it centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@9822796b018a /]#

可以看到,这里出现了root@9822796b018a /,也可以验证刚才说的这个/bin/bash是来自docker容器的/bin/bash,并不是宿主机的bash。

使用-d来让docker在后台运行(在后台运行容器并打印容器ID)

-d, --detach                         Run container in background and print container ID
[root@localhost ~]# docker run -itd centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
571491c0eddb7ab62eb75a0afcbb4c2c0585c017052f4f43ff6bb26c2c35a9b3

可以看到,使用-d后并没有进入docker容器,返回了一个docker容器的id,使用container ls看看容器状态

[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
571491c0eddb        centos              "/bin/bash"         About a minute ago   Up About a minute                       compassionate_ritchie
[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                            PORTS               NAMES
571491c0eddb        centos              "/bin/bash"         About a minute ago   Up About a minute                                     compassionate_ritchie
9822796b018a        centos              "/bin/bash"         4 minutes ago        Exited (130) About a minute ago                       zen_sammet
8f89ef93c881        centos              "/bin/bash"         12 minutes ago       Exited (127) 7 minutes ago                            trusting_feynman
e59eb9023981        centos              "/bin/bash"         26 minutes ago       Exited (0) 26 minutes ago    

容器短id为571491c0eddb为正常状态,其他的容器都是Exited(退出)。

随机的容器名太难记了,compassionate_ritchie,zen_sammet,trusting_feynman,suspicious_neumann,这都什么鬼,根本无法管理,继续翻--help发现有参数--name string 给容器分配一个名字,尝试一下

[root@localhost ~]# docker run -itd --name test-name centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
9e2556d3f6187b9f974cafa6554cf8b674b0d36fb2ed354bb02b695c6ce45133
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9e2556d3f618        centos              "/bin/bash"         35 seconds ago      Up 35 seconds                           test-name
571491c0eddb        centos              "/bin/bash"         16 minutes ago      Up 16 minutes                           compassionate_ritchie

其他的参数有什么用可以参考http://dockone.io/article/152

其他小命令

列举容器:docker container ls

重命名容器:docker container rename name/id rename

终止容器:docker container stop name/id

开启容器:docker container start name/id

重启容器:docker container restart name/id

进入容器:docker attach name/id 或 docker exec [options] name/id bashtype

容器日志:docker container logs name/id

删除容器:docker container rm name/id

需要注意的是两种连接容器的方式attach和exec的区别。

  1. attach会直接进入容器中,在容器中exit是会终止容器的。

  2. exec会连接到容器,可以自己配置 -i,-t,-d ,看看--help

[root@localhost ~]# docker container exec --help
 
Usage:  docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
 
Run a command in a running container
 
Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container

常用的-i,-t,-d已经说过啦=-=,exec会创建一个和容器的连接,执行exit会退出连接但是不会停止容器

让我们实际验证一下,创建两个容器,分别命名为attach和exec,并开启守护进程后台运行

[root@localhost ~]# docker run -itd --name attach centos \
> && docker run -itd --name exec centos
WARNING: IPv4 forwarding is disabled. Networking will not work.
6b422620730278aad75486123b70da4a36e0a554706f1783ebf4036c335524b5
WARNING: IPv4 forwarding is disabled. Networking will not work.
77ebabd23268be1c2c42af95186ea20732183b8ebbc7175c5d67c54f91589454
[root@localhost ~]# 
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
77ebabd23268        centos              "/bin/bash"         About a minute ago   Up About a minute                       exec
6b4226207302        centos              "/bin/bash"         About a minute ago   Up About a minute                       attach

使用attach进入name=attach的容器

[root@localhost ~]# docker container attach attach
[root@6b4226207302 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6b4226207302 /]# exit
exit
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
77ebabd23268        centos              "/bin/bash"         2 minutes ago       Up 2 minutes                            exec
[root@localhost ~]# docker container ls -a -f name=attach
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
6b4226207302        centos              "/bin/bash"         3 minutes ago       Exited (0) 30 seconds ago                       attach

可以看到,在exit后,name=attach的容器已经退出了。那么再试试exec

[root@localhost ~]# docker container exec -it exec bash
[root@77ebabd23268 /]# exit
exit
[root@localhost ~]# docker container ls -a -f name=exec
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
77ebabd23268        centos              "/bin/bash"         4 minutes ago       Up 4 minutes                            exec

可以看到,在exec命令中exit退出连接并不会导致容器的停止,这也是为什么大家在连接容器的时候推荐使用exec而不是attach。

使用docker container export name/id > exportFile 导出容器为一个快照

[root@localhost ~]# docker container export exec > exec.zip
[root@localhost ~]# ls
anaconda-ks.cfg  Dockerfile  exec.zip

使用docker import file/url [imageName[:tag]]来导入一个容器快照为镜像

[root@localhost ~]# docker image import exec.zip testImport/centos:test
invalid reference format: repository name must be lowercase
[root@localhost ~]# docker image import exec.zip test_import/centos:test
sha256:abb8688c070292f841668a5ff65e4f116c3b379cf2518a0485cf7d8bd2096521
[root@localhost ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
test_import/centos   test                abb8688c0702        30 seconds ago      202MB
redis                latest              75115edb5ba5        16 hours ago        340MB
centos               latest              1e1148e4cc2c        4 weeks ago         202MB

还记不记得docker仓库的命名方式呢?

使用自定义网络

有的时候docker容器中运行的应用可能需要访问外部网络,可以通过映射容器端口到宿主端口的方式来访问容器。让我们回顾一下docker run命令。

  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports

可以在docker run的时候使用-P来随机分配映射端口(49000~49900),也可以使用-p来指定宿主和容器的端口映射,在一个指定端口上只可以绑定一个容器。

支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。

[root@localhost ~]# docker run --name n1 -itd -p 8081:80 nginx
14ee84d648fbb018122ac1f827a14b0b72618a01328836b128124d9d388bf13d
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
14ee84d648fb        nginx               "nginx -g 'daemon of…"   11 seconds ago      Up 10 seconds       0.0.0.0:8081->80/tcp   n1

这里我实例化了一个nginx镜像,并将容器的80端口映射到了宿主机的8081端口上,通过宿主机的8081端口即可访问到容器80端口的nginx,为了方便查看,进入容器n1并改变nginx的默认index.html

[root@localhost ~]# docker exec -it n1 bash
root@14ee84d648fb:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@14ee84d648fb:/# cd /usr/share/nginx/html/ 
root@14ee84d648fb:/usr/share/nginx/html# ls
50x.html  index.html
root@14ee84d648fb:/usr/share/nginx/html# echo n1 > index.html

访问宿主机的8081端口,正确的访问到了宿主机。

注意:容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker还可以有一个可变的网络配置。)-p 标记可以多次使用来绑定多个端口。

docker的网络类型有3种:

  1. bridge[桥接]:默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了

  2. none[无指定网络]:使用 --network=none ,docker 容器就不会分配局域网的IP

  3. host[主机网络]:使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中

docker用docker network命令操作网络,看看--help

[root@localhost ~]# docker network
 
Usage:  docker network COMMAND
 
Manage networks
 
Options:
 
 
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 ls 来列举现有的所有网络类型

[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4fc7017db57d        bridge              bridge              local
81d8ea435074        host                host                local
ce52908ac500        none                null                local

使用docker network inspect name/id 来查看一个网络的相信信息

[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "4fc7017db57d1344801d8353c8a7c28d61786eb6eac29dd49b77389e48bf4d9e",
        "Created": "2019-01-03T14:10:46.650855531+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0d7ffb3991b761652b538dad0885b11ceac1a9ac641ff2067d3ff16b5ca0afac": {
                "Name": "n2",
                "EndpointID": "c21a13ef287351892af5253dc8bd9fe5f1a296b7bb0dec55abb1d54aa6491344",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "14ee84d648fbb018122ac1f827a14b0b72618a01328836b128124d9d388bf13d": {
                "Name": "n1",
                "EndpointID": "8549d0c755d972792c43a5147584b7bbbaefa5dd415a91249d50050353033561",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "b80350c5056e469a978bf0c75e270e208d9dac7d3e145fe8425b73d1e52831eb": {
                "Name": "n3",
                "EndpointID": "388b63dcf72c725a8c70f28a18a8e4911383f732ea57daafaebf7094b6f02dc6",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

里面有详细的网络设置和使用该网络容器的信息。

因为默认的桥接网络在重启后可能会导致ip更变,所以强烈建议自己为docker设置一个网络

[root@localhost ~]# docker network create --help
 
Usage:  docker network create [OPTIONS] NETWORK
 
Create a network
 
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which copying the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment

使用docker network create --subnet=172.99.0.0/16 test 来创建一个docker用的网段(使用默认的桥接模式,有需要也可以使用-d更改网络类型)

[root@localhost ~]# docker network create --subnet 172.99.0.0/16 test
9dc921fd4ac7d09292506a074a5621163870334ae86cee72c1857c2e2086a406
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4fc7017db57d        bridge              bridge              local
81d8ea435074        host                host                local
ce52908ac500        none                null                local
9dc921fd4ac7        test                bridge              local

使用docker run 里的--net 来指定网络配置,--ip来指定ip

[root@localhost ~]# docker run -itd --name c1 --ip 172.99.0.11 --net test -p 8091:80 centos
2a63099b0c1e6e75f92abf2272d19433b81d6b3bdc1fae5cacb0fa48082f8d29
[root@localhost ~]# docker run -itd --name c2 --ip 172.99.0.12 --net test -p 8092:80 centos
20c36eef0a3c5c7ebb85c1c558d2ccc055223c6436c85348037027feb372f9b2
[root@localhost ~]# docker run -itd --name c3 --ip 172.99.0.13 --net test -p 8093:80 centos
1e9b227f2b82fe6f48dbeae4bce8e4bb2583dcbf311698228d0cdef5c0779634

进入c1,ping c2,ip正常,容器之间是可以通信的

[root@2a63099b0c1e /]# ping c2
PING c2 (172.99.0.12) 56(84) bytes of data.
64 bytes from c2.test (172.99.0.12): icmp_seq=1 ttl=64 time=0.111 ms
64 bytes from c2.test (172.99.0.12): icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from c2.test (172.99.0.12): icmp_seq=3 ttl=64 time=0.100 ms
64 bytes from c2.test (172.99.0.12): icmp_seq=4 ttl=64 time=0.090 ms

总结一下

这一篇比较长,总结一下都学到了什么。同时这一篇过后docker的基本使用的学习也就结束了。

docker的使用流程:在docker仓库中寻找我们需要的docker镜像,使用镜像构建一个或多个容器,在容器中操作对应的环境。

docker仓库:目前 Docker 官方维护了一个公共仓库 Docker Hub

你可以通过 docker search 命令来查找官方仓库中的镜像。 docker search [OPTIONS] TERM

根据是否是官方提供,可将镜像资源分为两类。一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如 ansible 用户。

执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录Docker Hub,通过 docker logout 退出登录。利用 docker pull 命令来将它下载到本地。

执行docker pull name的时候会默认使用tag:latest(最新的镜像),也可以自己制定tag来拉取镜像。

使用docker images查看本地所有的镜像。其中占用空间的体积和docker hub上的文件大小是不一样的。这是因为 Docker Hub 中显示的体积是压缩后的体积。

还有一种特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 none 这类无标签镜像也被称为 虚悬镜像(dangling image) 。

如果要删除本地的镜像,可以使用 docker image rm 命令,也可以简写为docker rmi

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

Docker 还存在一个特殊的镜像,名为 scratch (FROM scratch)。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

RUN 执行命令。RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:

  1. shell 格式: RUN 命令 ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中

的 RUN 指令就是这种格式。

  1. exec 格式: RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式。

构建镜像使用命令docker build docker build [OPTIONS] PATH | URL |

常用的命令为 docker build -t name:tag PATH,PATH 不仅仅代表当前目录,在docker中,这个PATH属性代表的是镜像构建的上下文路径(Context)。

容器是独立运行的一个或一组应用,以及它们的运行态环境。新建容器并启动的命令是docker run,经常会使用的命令是docker run --name YOUR_NAME --net NET_TYPE --ip IP --p HOST:PORT:CONTAINER_PORT -itd IMAGENAME

其中--name可以修改容器名字,--net可以修改网络类型,--ip可以配置固定ip,--p可以为宿主机和容器做端口映射,-i保持输入设备打开,-t打开一个虚拟输入设备,-d在后台运行守护进程。

列举容器:docker container ls

重命名容器:docker container rename name/id rename

终止容器:docker container stop name/id

开启容器:docker container start name/id

重启容器:docker container restart name/id

进入容器:docker attach name/id 或 docker exec [options] name/id bashtype

容器日志:docker container logs name/id

删除容器:docker container rm name/id

attach会直接进入容器中,在容器中exit是会终止容器的。exec会创建一个和容器的连接,执行exit会退出连接但是不会停止容器。

使用docker container export name/id > exportFile 导出容器为一个快照。

使用docker import file/url [imageName[:tag]] 来导入一个容器快照为镜像。

因为默认的桥接网络在重启后可能会导致ip更变,所以强烈建议自己为docker设置一个网络,使用docker network create --subnet=172.99.0.0/16 test 来创建一个docker用的网段(使用默认的桥接模式,有需要也可以使用-d更改网络类型)使用docker run 里的--net 来指定网络配置,--ip来指定ip

附件

dockerfile

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论