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など
广告
将在 10 秒后关闭
bannerAds