接前文《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 search命令搜索需要的镜像,比如java。具体命令格式:docker search 镜像名:标签。
(当然还可以从官方网页上搜索:https://hub.docker.com/search/?)
先解释一下标签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 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 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中的文件共享里添加才可用:
否则会报错:
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
nginx容器启动后,我们就可以访问80端口了。至此,容器已经运行起来了。
- 登入容器
容器已经运行起来了,那如果进入容器查看容器内的进程该怎么办?使用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
root@852a9e21d5bd:/# 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 镜像名
- 小结