Docker的初步使用

接前文《Docker是个好东西》的牢骚,开始进入正题。本文旨在让朋友们对Docker有个初步的认识,安装并简单的使用起来。更深入的参见后续文章或者自行度娘。

  • Docker基础概念
在使用Docker之前,我们先了解下几个Docker的核心概念
Docker Daemon:Docker引擎,就是运行在后台的一个守护进程,在我们启动它之后,我们就可以通过Docker客户端发送相关Docker的命令。
Docker Images:Docker镜像,这个就类似于我们在安装Windows时的镜像,只不过windows的镜像,在以前我们通常存在光盘上或者U盘里,这里的镜像我们通常会发布到Docker Registry

Docker Containers:Docker容器,在获取到Docker镜像之后,我们可以运行该镜像,此时便会启动一个Docker容器,该容器中运行镜像中的程序。

这里多说一句:可以这样简单理解——如果把Docker镜像理解为一个类的话,那么Docker容器就是一个实例。Docker镜像是一个只读的程序,每个镜像的实例(也就是Container容器)是以各种形态将镜像程序运行的动态程序并管理着各自修改过的内容。

Docker Client:Docker客户端,我们安装完Docker之后,我们打开终端使用docker 相关命令进行操作,这些命令便是Docker客户端的命令,另外还有一个基于REST API的Docker客户端,REST API一般用于在开发一些基于Docker运维的系统中使用。

Docker Registry:Docker镜像注册中心,Docker的官网的注册中心为http://hub.docker.com。我们也可以自己搭建自己的注册中心。注册中心就好比代码的仓库,有自己需要的“代码”(即镜像)就从仓库pull下来。如果制作好了一个镜像想个其他人用,就可以push一个做好的镜像到仓库,其他人都可以pull使用。就好比一个软件分发的中转站。

  • Docker安装

到官网下载对应平台的版本:https://store.docker.com/search?offering=community&type=edition

安装很简单,下一步下一步就ok了。我的Mac版本运行起来后,在状态栏上会有管理的图标:可以看到“Docker is running”

Docker的初步使用

这样Docker后台程序已经运行起来了,可以开始使用Docker了。


  • 下载镜像

在命令行下使用docker search命令搜索需要的镜像,比如java。具体命令格式:docker search 镜像名:标签。

(当然还可以从官方网页上搜索:https://hub.docker.com/search/?)

Docker的初步使用

先解释一下标签TAG,就好比同一个软件会有不同的版本,这个tag就好比版本号。默认为latest,即为最新的版本。比如java现在最新的为9,如果想下载8的版本,可以使用docker search java:8

KumasMBA:~ kumas$ docker images

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE

rabbitmq                          management-alpine   c0b4bd9e1a74        5 days ago          83MB

zookeeper                         latest              bf5cbc9d5cac        3 weeks ago         146MB

memcached                         latest              78988adb8ac3        5 weeks ago         58.6MB

arcts/keepalived                  latest              49f8e516afdc        2 months ago        13.4MB

webhippie/mongodb                 latest              7a5585978ecf        2 months ago        302MB

比如要找nginx,会搜索到好多,我们选择一个版本(stars可以理解为点赞的数量,Official表示是官方发布的镜像)

Docker的初步使用

下载的命令:

docker pull 镜像名,比如我们下载官方的版本:

KumasMBA:~ kumas$ docker pull nginx

Using default tag: latest

latest: Pulling from library/nginx

f2aa67a397c4: Already exists 

3c091c23e29d: Pull complete 

4a99993b8636: Pull complete 

Digest: sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35

Status: Downloaded newer image for nginx:latest


在执行完以上命令之后,Docker Client会从Docker镜像注册中心下载nginx的镜像,待下载之后,我们查看本地的镜像。

KumasMBA:~ kumas$ docker images

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE

rabbitmq                          management-alpine   c0b4bd9e1a74        5 days ago          83MB

zookeeper                         latest              bf5cbc9d5cac        3 weeks ago         146MB

nginx                             latest              ae513a47849c        5 weeks ago         109MB


下载完如何使用,在网页版上有说明(也有的镜像并没有使用说明),点击details可以查看(这些大家可以后续慢慢了解):

https://hub.docker.com/_/nginx/

Docker的初步使用



  • 创建并启动容器

有了镜像,我们可以创建启动容器了。启动容器的命令是docker run,可以查看帮助。

KumasMBA:~ kumas$ 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

该命令有很多参数,这里先说一下最基本的几个参数,先让容器运行起来。

KumasMBA:~ kumas$ docker run -d -p 80:80 --name my-custom-nginx-container -v /tmp/:/etc/nginx/ nginx

53c8e2ac888aaf09457778eea6ab448733f3d3f331cb87eedd0d428dbd3e3d4e

-d:容器启动后,后台运行,否则以前台方式运行,shell关闭后容器也停止运行。

-p:映射端口,前面的端口号是指的宿主机的端口,后面的端口号是容器内运行的端口。比如:-p 81:80意思是将宿主机的81端口和容器上的80端口进行映射关联。当访问localhost:81时,就相当于在容器里面访问localhost:80。

--name:给启动的容器起一个别名,如果不设置,系统会自动生成一个名字。这个参数为了便于管理容器。

-v:将宿主机的某个路径映射到容器的某个路径下,前面是宿主机路径,后面是容器路径(注意,也可以是文件)

注意:宿主机的路径必须在docker的preference中的文件共享里添加才可用:

Docker的初步使用

否则会报错:

KumasMBA:~ kumas$ docker run -d -p 80:80 --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf nginx

c2fc74de55bd7057164957a0cf2bb576e5d929c366bb07088907a056f1be7a22

docker: Error response from daemon: Mounts denied: 

The path /host/path/nginx.conf

is not shared from OS X and is not known to Docker.

You can configure shared paths from Docker -> Preferences... -> File Sharing.

See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.

.


  • 查看容器状态

创建并启动容器后,查看容器是否运行:docker ps

KumasMBA:~ kumas$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES

852a9e21d5bd        nginx               "nginx -g 'daemon ..."   2 seconds ago       Up 1 second         0.0.0.0:80->80/tcp   my-custom-nginx-container


默认不加参数,只显示运行中的容器。docker ps -a会列出所有的容器。在管理容器时,通过container id和names都可以代表该容器。

nginx容器启动后,我们就可以访问80端口了。至此,容器已经运行起来了。

Docker的初步使用


  • 登入容器

容器已经运行起来了,那如果进入容器查看容器内的进程该怎么办?使用docker exec命令。

KumasMBA:~ kumas$ docker exec --help


Usage: docker 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

      --help                 Print usage

  -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>])

KumasMBA:~ kumas$ docker exec -it 852a9e21d5bd /bin/bash

[email protected]:/# ls -l

total 64

drwxr-xr-x   2 root root 4096 Apr 26 00:00 bin

drwxr-xr-x   2 root root 4096 Feb 23 23:23 boot

drwxr-xr-x   5 root root  340 Jun  5 05:40 dev

drwxr-xr-x   1 root root 4096 Jun  5 05:40 etc

drwxr-xr-x   2 root root 4096 Feb 23 23:23 home

drwxr-xr-x   1 root root 4096 Apr 26 00:00 lib

drwxr-xr-x   2 root root 4096 Apr 26 00:00 lib64

drwxr-xr-x   2 root root 4096 Apr 26 00:00 media

drwxr-xr-x   2 root root 4096 Apr 26 00:00 mnt



这样就进入到容器内了。

-it:表示交互式方式;container参数可以使用容器id,也可以使用name;command参数是指容器内的命令。

示例中的命令意思就是在852a9e21d5bd这个容器内运行/bin/bash命令。进入容器后,就相当于在一个虚拟机里操作了。


  • 启动/停止/删除容器

容器的启动停止命令很简单:docker start/stop <容器id或者容器名>

删除容器:docker rm <容器id或者容器名>


  • 删除镜像

删除镜像:docker rmi 镜像名


  • 小结
本文只是简单的介绍了一下Docker的初步使用,目的是给大家一个直接的印象。还有好多我个人使用过程中的心得限于篇幅,将在后续文章中补充:比如,给container指定主机名,创建网络连接,由于配置文件错误导致容器无法启动怎么解决,镜像备份迁移、一些小巧的镜像推荐、自己制作镜像等等。