Docker 入门
因为我是Docker的新手,所以我会简单介绍一下环境搭建、启动简单的容器以及Dockerfile和一些docker xx命令行。
使用Dockerfile自定义他人成品时,可以顺利进行而无需困扰。
-
- 他人のDockerfileを再利用して楽をする
-
- GithubのDockerfiles
- Dockerhubに登録されたDockerfile
在EC2上設置Docker環境。
首先,先建立一个EC2实例并运行Docker来测试一下。对于EC2,使用t2-micro规格就足够了。
通过apt-get install docker.io进行安装,但可能会安装v1.0版本。如果想要使用fig等工具,则需要v1.3以上的版本,所以最好直接从docker.io获取最新版本。
#curl -sSL https://get.docker.io/ubuntu/ | sudo sh
#apt-get update
#apt-get -y install sysv-rc-conf
#sysv-rc-conf docker on
在中文中,以下是对上述句子的本地化改写:
通过运行命令 “docker version” 来确认 Docker 客户端的版本。
# docker version
Client version: 1.4.1
Client API version: 1.16
...
首次使用Docker
如果你是初次使用,可以先尝试创建一个简单的容器,例如nginx等,并尝试使用各种docker命令来熟悉。当你熟悉后,可以根据Dockerfile的最佳实践进行优化。
将以下内容保存为名为Dockerfile的文件。创建一个基于Ubuntu14.04、带有curl和nginx的容器配置。
FROM ubuntu:14.04
RUN apt-get update && apt-get -y install nginx curl
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]
然后,从创建的Dockerfile目录中,毫不犹豫地执行以下命令。
#docker build -t test1/test:1.0 ./
#docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test1/test 1.0 55469de80222 57 seconds ago 250.3 MB
ubuntu 14.04 5ba9dab47459 12 days ago 192.7 MB
#docker run -p 25525:80 -d test1/test:1.0
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
b54eb8dd4253 test1/test:1.0 "/bin/sh" 8 seconds ago Up 8 seconds 0.0.0.0:25525->80/tcp
#curl localhost:25525
当对curl命令进行请求时,如果能够显示出”Welcome to nginx”的HTML内容,表示容器中的nginx正在正确响应,表明操作已成功。
Docker的困惑之处
我将列举一些作为Docker初学者容易遇到的问题和陷阱。
如果Process不在前台运行,容器将会终止。
这件事非常重要!
如果想在Docker容器中运行nginx、mongo或elasticsearch,不能仅仅在Dockerfile中使用RUN service nginx start之类的方式!仅仅后台运行是绝对不行的!
顺便提一下,上述Dockerfile中的echo “daemon off;” >> /etc/nginx/nginx.conf这个神秘的操作,是为了防止nginx守护进程化(后台执行)。如果在『Docker』『前景』等关键词下进行搜索,可以找到针对这个问题的最佳实践。
在我发现的范围内,有以下这样的解决方法。请问Supervisor很流行吗?
* 使用Supervisor
* 创建无限循环的shell脚本,并在Dockerfile的CMD中调用
* 在docker run启动容器时,也启动服务
如果在运行docker run xxx和docker ps之后无法找到正在运行的容器,可能原因是这样。请使用docker ps -a来检查容器是否已经被结束。
我想要操作docker容器的shell。
在搬运容器之后,一段时间之后它的状态似乎不太好,我认为有很多情况下你会想进入其中进行shell操作以确认其运行状态。在这种情况下,请使用docker exec工具。这是一个从docker v1.3版本开始支持的实用工具,你可以使用#docker exec –it bash来操作。
顺便说一下,在1.3版本之前,采用了以下的方法,但1.3版本之后可以通过docker exec更加方便地进行操作。
docker logs でstdoutのlogを眺める
containerのlogを/var/logなどに吐き出す様にしておき、/var/logを docker run -vでhost側からもアクセス出来るようにする
containerにsshdを仕込んでおき、sshでcontainerにlogin/shell操作する
nsenterというtoolをcontainerに仕込んでおき、 containerのprocessに入りshell操作する
我想知道Docker容器的资源消耗量。
从docker v1.5版本开始,我们可以使用docker stats 命令来获取容器的CPU、内存和网络流量信息。
如果我们连续列举多个容器的容器ID,例如docker stats ,它会汇总并输出这些容器的信息。如果我们使用docker stats $(docker ps -q)命令,它会输出所有正在运行的容器的资源使用情况。
Docker命令
使用Docker构建
使用 Dockerfile 创建 docker image。对于以下情况,导航到位于 ./dokcertest 目录下的 Dockerfile。
#docker build -t test1/test:1.0 ./dockertest
请确认通过”docker images”命令创建的镜像已经完成。
#docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZ
test1/test 1.0 407b5768bc5f 5 hours ago 467.5 MB
ubuntu 14.04 5ba9dab47459 10 days ago 192.7 MB
使用”docker build –no-cache -t test1/test:1.0 ./dockertest”命令,强制重新创建名为test1/test:1.0 的docker image。
运行 Docker(一种最常见的方法)
使用docker image启动容器(使用在docker images命令中显示的镜像ID或使用在构建时使用-t标记指定的repository/tag进行指定)。使用-d参数使其在后台运行。
#docker run -d 407b5768bc5f
#docker run -d test1/test:1.0
如果您想启动最新创建的图像,则可以使用以下命令:docker images -q | head -1 会提供最新的图像ID。
#docker run -d $(docker images -q | head -1)
运行 Docker(指定端口)。
将Container的端口80映射到主机的端口25525,并启动。
#docker run -p 25525:80 -d 407b5768bc5f
#docker run -p 25525:80 -d test1/test:1.0
在主机上,执行curl localhost:25525命令,会将请求传递到容器上的端口80,并接收到容器上HTTP服务器的响应。(前提是容器上已经配置了HTTP服务器的启动)
在 Docker 中运行(切换到容器的 shell)。
当在Container上使用”-it”选项启动时,会进入Container的shell环境。如果在Dockerfile的CMD或ENDPOINT中有前台运行的应用程序,则会显示其日志。如果没有前台运行的应用程序,您可以在Container中操作shell。使用”ctl+p”→”ctl+q”可以返回到Host的shell环境。
#docker run -it 407b5768bc5f
#docker run -it test1/test:1.0
注意事项:
– 在进行IT操作时,请勿添加-d(否则会导致后台启动)。
运行 Docker(使容器能够访问主机目录)
可以使用-v选项,以(宿主机的绝对路径):(容器的绝对路径)的格式进行表示。绝对路径必须提供。
#docker run -v /home/ubuntu:/root/test -d 407b5768bc5f
#docker run -v /home/ubuntu:/root/test -d test1/test:1.0
用Docker运行(强制将容器以shell模式启动)。
#docker run -it 407b5768bc5f /bin/sh
#docker run -it test1/test:1.0 /bin/sh
当在docker中使用”docker run xxx /bin/sh”命令时,容器启动时将会覆盖Dockerfile中的CMD内容,而不会执行Dockerfile中的CMD内容,进而进入容器的shell状态。当容器无法按预期运行时,可以使用上述命令”docker run -it xxx /bin/sh”进入容器的shell,并阻止执行CMD内容,然后可以在容器的shell中使用配置来输出大量的调试日志,以便进行调试。
顺便提一下,在我刚开始接触Docker的时候,我看别人的Docker命令文章时,认为在执行docker run命令时,总是需要在最后加上/bin/sh选项(真是太尴尬了)。
Docker链接
如果要与其他容器进行协作时使用。由于长度较长,请有兴趣的人参考本文。
列出正在运行的 Docker 容器.
可以使用docker命令来检查Docker的运行状态。当想要停止容器时,经常需要使用docker stop等命令来确认容器ID。
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
6707e5555b5a test1/test:1.0 "/bin/sh" 3 seconds ago Up 2 seconds 24224/tcp, 80/tcp
romantic_blackwell
当运行”docker ps -a”命令时,可以查看包括过去的容器在内的状态,因此在怀疑容器意外停止时,可以通过这个命令来确认。
停止Docker
停止 Docker 容器(指定使用 `docker ps` 显示的容器 ID)。
#docker stop 6707e5555b5a
停止container在所有操作中
#docker stop $(docker ps -q)
Docker日志
请显示docker容器的标准输出日志。当容器运行出现问题时,可使用该命令查看标准输出日志。
如果需要在docker容器中执行各种shell命令以进行调试等目的,请使用docker exec命令。
#docker logs 6707e5555b5a
在中国本土语言中,将以下语句翻译为简体中文:
docker 执行
如果想进入Docker容器并查看容器的运行状态和日志,可以使用这个工具。
从Docker v1.3开始支持(非常方便!)。
在那之前,我们要在容器中安装sshd或使用nsenter工具进行操作,但现在Docker工具已经支持了。
#docker exec –it 6707e5555b5a bash
删除 Docker 镜像
删除Docker镜像
#docker rmi 407b5768bc5f
REPOSITORY が <none> になっているものを強制削除する場合
#docker rmi -f $(docker images | awk '/^<none>/ { print $3 }')
全てのDocker imageを強制削除
#docker rmi -f $(docker images -q)
删除docker实例
删除Docker容器
#docker rm `docker ps -a -q`
有用的文章
- dockerコマンド, DockerfileのOptionなど