Docker 的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
安装完成后,运行下面的命令,验证是否安装成功。
$ docker version# 或者$ docker info
Docker 需要用户具有 sudo 权限,为了避免每次命令都输入 sudo,可以把用户加入 Docker 用户组(官方文档)。
$ sudo usermod -aG docker $USER
Docker 是服务器--客户端
架构。命令行运行 docker 命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动(官方文档)。
# service 命令的用法$ sudo service docker start# systemctl 命令的用法$ sudo systemctl start docker
查看 docker 版本
$ docker versionClient: Version: 1.12.1 API version: 1.24 Go version: go1.7.1 Git commit: 6f9534c Built: Thu Sep 8 10:31:18 2016 OS/Arch: darwin/amd64Server: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 17:52:38 2016 OS/Arch: linux/amd64
搜索可用 docker 镜像
$ docker search <image_name># 例如$ docker search tutorial NAME DESCRIPTION STARS OFFICIAL AUTOMATED learn/tutorial 40georgeyord/reactjs-tutorial This is the backend of the React comment b... 5 [OK] microsoft/aci-tutorial-app 2fiware/tutorials.tourguide-app FIWARE Tour Guide App sample application 1 [OK] mhausenblas/kairosdb-tutorial GitHub fetcher for KairosDB tutorial 1 [OK] microsoft/aci-tutorial-sidecar 1muli/gluon-tutorials-zh https://github.com/mli/gluon-tutorials-zh 1 [OK] chris24walsh/flask-aws-tutorial Runs a simple flask webapp demo, with the ... 1 [OK] colemurray/medium-facenet-tutorial Container for medium-facenet-tutorial. Con... 1fgraichen/concourse-tutorial-hello-world 0camphor/python-tutorial camphor-/python-tutorial 0 [OK] activeeon/par-connector-tutorial Do the par-connector tutorial with R. The ... 0 [OK] splicemachine/tutorial-spark-kafka-consumer Spark Streaming Tutorial 0krishnatest/docker-nodejs-tutorialkk docker-nodejs-tutorialkk 0rade95/concourse-tutorial-hello-world 0helinwang/paddle-k8s-tutorial 0sahotay/concourse-tutorial-hello-world 0kidikarus/concourse-tutorial-47-tasks 0lukasheinrich/quickana-tutorial Image for the analysis code built from htt... 0starkandwayne/concourse-tutorial-ci 0bluerdocker/concourse-tutorial-hello-world 0dlws/tutorial-tensorflow-cpu 0joshuacox/rabbitmq-tutorials Rabbit MQ Tutorial Demos 0 [OK] cloudboost/tutorial 0starkandwayne/concourse-tutorial 0
问题一:默认情况下 docker 是到哪里拉取镜像的?如何自定义配置?
回答:默认拉取地址:https://hub.docker.com
centos 下修改为国内源:
# 在 /etc/sysconfig/docker 文件中末尾增加一行:DOCKER_OPTS="--registry-mirror=http://hub-mirror.c.163.com"# 然后重新运行 docker 服务:service docker restart
问题二:拉取下来的镜像又是放在哪里?如何自定义配置?
回答:通过下面命令查看
docker info | grep "Docker Root Dir"
通过下面方法自定义路径:
## 如果是 CentOS 则添加下面这行:OPTIONS="--graph=/root/data/docker" --selinux-enabled -H fd://## 如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux):OPTIONS="--graph=/root/data/docker" -H fd://## 或者添加配置信息DOCKER_OPTS="-g /root/data/docker"
在容器中运行命令
docker 容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
docker run
命令有两个参数,一个是镜像名,一个是要在镜像中运行的命令。
$ docker run learn/tutorial echo "hello word"hello world $ docker run learn/tutorial cat /etc/issue Ubuntu 12.04 LTS \n \l
在容器中安装新的程序
下一步我们要做的事情是在容器里面安装一个简单的程序(ping)。我们之前下载的 tutorial 镜像是基于 ubuntu 的,所以你可以使用 ubuntu 的 apt-get 命令来安装 ping 程序:apt-get install -y ping
。
备注:apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
注意:在执行 apt-get 命令的时候,要带上 -y 参数。如果不指定 -y 参数的话,apt-get 命令会进入交互模式,需要用户输入命令来进行确认,但在 docker 环境中是无法响应这种交互的。
$ docker run learn/tutorial apt-get install -y ping Reading package lists... Building dependency tree... The following NEW packages will be installed: iputils-ping0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 56.1 kB of archives. After this operation, 143 kB of additional disk space will be used.Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]debconf: delaying package configuration, since apt-utils is not installed Fetched 56.1 kB in 1s (28.8 kB/s) Selecting previously unselected package iputils-ping. (Reading database ... 7545 files and directories currently installed.) Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... Setting up iputils-ping (3:20101006-1ubuntu1) ...
保存对容器的修改
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。docker 中保存状态的过程称之为 committing
,它保存的新旧状态之间的区别,从而产生一个新的版本。
使用 docker ps -l
命令获得安装完 ping 命令之后容器的 id。然后把这个镜像保存为 learn/ping
。
使用 docker commit 来保存对容器的修改:
运行 docker commit,可以查看该命令的参数列表。
你需要指定要提交保存容器的 ID。(译者按:通过docker ps -l 命令获得)
$ docker commit fa56b78b5a50 learn/pingsha256:c7e772ec6d5112b84831a7130c74e5a0d0cd1804ad9426b004230c7a0af7ba94 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE learn/ping latest c7e772ec6d51 28 seconds ago 139.5 MB learn/tutorial latest a7876479f1aa 5 years ago 128 MB
但是实际环境中并不推荐如上所示的 commit 用法,具体可以查看《Docker 从入门到实践》中的描述,总结下来为三点:
由于
commit
命令的执行,有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。使用
commit
生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。不符合分层存储的概念,即除当前层外,之前的每一层都是不会发生改变的。
使用运行新镜像
在新的镜像中运行 ping www.163.com
命令。一定要使用新的镜像名 learn/ping
来运行 ping 命令。(因为最开始下载的 learn/tutorial
镜像中是没有 ping 命令的)
$ docker run learn/ping ping www.163.com PING www.163.com.lxdns.com (115.223.24.39) 56(84) bytes of data.64 bytes from 115.223.24.39: icmp_req=1 ttl=37 time=0.264 ms64 bytes from 115.223.24.39: icmp_req=2 ttl=37 time=0.546 ms
查看容器中的日志
## 实时查看 docker 容器日志$ docker logs -f -t --tail 行数 容器名
作者:Uchen
链接:https://www.jianshu.com/p/1c64983da36f