如何使用Docker
首先
希望此次的实习经历能对大家有所帮助,我在株式会社Saic Seed的实习期间引入了Docker技术。
導入環境
・windows7
・vagrant
Docker的使用方法
访问Docker容器
正确设置Vagrant侧的端口转发,以便从主机侧(即PC侧)可以访问Vagrant的特定端口。
访问容器是通过以下方式进行的:
电脑 ⇔ Vagrant ⇔ Docker容器
例如,
计算机 ⇔ 流浪者
将PC和Vagrant的IP地址和端口转发设置如下
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "forwarded_port", guest: 8888, host: 8080
流浪者 ⇔ Docker容器 ⇔ Docker
将vagrant和Docker容器的端口转发设置如下。
$ sudo docker run -d -p 8080:3000 tera_shin/centos_test:latest
以下内容的中文释义:
从个人电脑访问Docker容器
上記のような設定になっている時、PCからvagrantのIPアドレス(192.168.33.10)またはsshアドレス(127.0.0.1)の8888番ポートにアクセスすると、
vagrantの8080番ポートを介して、Dockerコンテナの3000番ポートにアクセスすることができる。
有关Dockerfile的内容
参考:Dockerfile 的最佳实践
Dockerfile是什么
Dockerfileは、Dockerイメージの構成内容をまとめて記述できるファイル。
“docker build”を行う際に参照され、このファイルに記述された内容が実行された上で、
Dockerイメージが作成される。
設定をコードとして明示的に記述することで、ミスを防ぎ変更を容易にすることできる。
1.基本
Dockerfileの基本的な書き方
1行につき1つの操作を”命令”と”引数”でスペース区切りで記述する。
命令 引数
“#”から始まる行はコメントとして処理される。
“docker build”コマンドによって、Dockerfileファイルの上から順番に処理が実行される。
构建 Docker 镜像
$ sudo docker build -t Dockerhubのユーザー名/任意のイメージ名 Dockerfileのディレクトリ(今いるディレクトリなら".(ピリオド)")
请用中文翻译以下内容,只需要一种版本:
I am going to the store to buy some groceries.
我要去商店买些杂货。
常用的指令列表
以下是記述例:
请具体如下所述。
FROM centos:centos6
MAINTAINER tera_shin <tera_shin@gmail.com>
RUN yum -y update && \
yum install -y \
sudo \
git \
make \
gcc \
gcc-c++ \
httpd
RUN groupadd -r developers && \
useradd -r -g developers developer && \
echo 'developer:1234' | chpasswd && \
echo "developer ALL=(ALL) ALL" >> /etc/sudoers && \
chown -R developer ~/ && \
chown -R developer /usr/share/nginx/html
ENV HOME=/home/developer
WORKDIR $HOME
ENV APP_ROOT=/var/www/html
VOLUME $APP_ROOT
COPY my_app $APP_ROOT/my_app
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
请你明天早上10点来我办公室。
2. “命令”的解释
“命令”のいくつかについて説明します。
(1)从
使用”docker build”命令来创建Docker镜像时,需要指定用作基础的Docker镜像。
在示例中,指定的基础镜像是centos:centos6。
可以在DockerHub上搜索Docker镜像。
(2)维护
在Dockerfile中记录有关创建者的信息。
通常是记录DockerHub用户名和邮箱地址。
(3)RUN
buildしたときに元となるdockerイメージに対して実行する処理を記述する。
\(バックスラッシュ)を用いて、複数行に分けることもできる。
最新バージョンのパッケージをインストールする際は、
yum updateとyum install -yを同じRUN 命令文で連結するようにする。
記述例の2つめのRUNでは、グループとユーザーを追加している。
ユーザーを追加しておくと、dockerイメージに対してRUNなどの”命令”を
実行するユーザーを”root”以外にも指定することができる。
実行ユーザーを指定する際は、USERを用いる。
USER ユーザー名
# 例:
USER developer
(4)环境
可以设置要创建的docker镜像的环境变量。
(5)工作目錄
指定要執行操作的目錄。
(6)卷
可以将docker镜像内的目录指定为卷。
对于指定为卷的目录中进行的所有更改
都不包含在docker镜像中。
在运行已创建的Docker镜像时,如果对指定的目录进行挂载到VOLUME上,那么当容器停止时,容器内VOLUME所做的更改将被丢弃。
当对指定的目录进行挂载并将容器制作为镜像时,
容器内部指定的目录将不会包含在镜像中,
而只会包含其他部分,因此可以将应用程序和开发环境分开。
(7)复制
可以指定要添加到docker镜像内的目录。
可以按照以下方式进行描述。
COPY ホスト側のディレクトリ dockerイメージ側のディレクトリ
※主机端的目录可以使用相对路径从Dockerfile所在的目录指定。
Docker镜像端的目录需要使用绝对路径来描述。
(8)公开
可以指定容器暴露给外部的端口。
仅通过指定公开端口到EXPOSE并不能访问容器,
需要在容器运行时通过-p或-P标志进一步公开端口,
才能访问容器。
(9)CMD
可以在运行时在容器内执行的操作进行编写。
只能在Dockerfile中进行一次性的编写。
在CMD中,通过逗号分隔来描述命令数组。
示例中的CMD [“/usr/sbin/httpd”, “-D”, “FOREGROUND”]与以下表达相同。
$ /usr/sbin/httpd -D FOREGROUND
请用中文重新表述以下内容,只需要一种选项:
I went to the store yesterday to buy some groceries.
如何在Dockerfile中排除未使用的文件和文件夹
如果要从Dockerfile构建映像,那么Dockerfile所在的目录内容将被传递给Docker。如果传递了不必要的文件或文件夹,构建过程就会花费额外的时间。因此,可以使用.dockerignore来指定不需要的文件或文件夹。
1. Natively paraphrased in Chinese:
例:请用中文重新表述以下句子,只需要一种方式:
1. “I am going to the park tomorrow.” (明天我打算去公园。)
(Note: This response is just a sample, and there are multiple ways to paraphrase the sentence in Chinese.)
.rspec
log
tmp
db/*.sqlite3
db/*.sqlite3-journal
vendor/assets
node_modules
※ 可以通过将文件名指定为 “.dockerignore.” 来创建 .dockerignore 文件。
关于docker-compose
docker-compose是什么?
docker-compose是一款用于定义和执行由多个容器组成的docker应用程序的工具。只需准备一个docker-compose配置文件并执行相应命令,即可一次性启动所述的容器。
1.安装docker-compose
根据:安装 Docker Compose
如果已经安装了 Docker Toolbox,那么 docker-compose 也会随之安装,
可以直接使用。
如果没有安装,可以按照以下步骤进行安装:
(1)安装 docker-compose。
$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
给予权限
$ chmod +x /usr/local/bin/docker-compose
把以下内容用中文本地化改写(仅需提供一种选项):
2. Docker-compose的编写方式
创建一个名为 “docker-compose.yml” 的文件,并用YAML格式进行描述。
常用的句式一覽
以下是記述例:
version: '2'
services:
db:
image: mysql:5.7.17
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
volumes:
- db-data:/var/lib/mysql
redis:
image: redis:3.2.8
volumes:
- ./data/redis:/data
ports:
- '6379:6379'
app:
build:
context: .
dockerfile: Dockerfile.dev
environment:
HOME: $HOME
APP_ROOT: $APP_ROOT
MYAPP_DATABASE_USERNAME: root
MYAPP_DATABASE_HOST: db
REDIS: "//redis:6379"
REDIS_HOST: redis
REDIS_PORT: 6379
web:
extends:
service: app
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
- redis
worker:
extends:
service: app
command: bundle exec sidekiq -q notification
volumes:
- .:/myapp
links:
- db
- redis
volumes:
db-data:
driver: local
请您提供的句子请问有什么需要翻译的?
3.语法解释
我将解释一些句子结构。
(1)服务
将每个服务的设置捆绑在一起。
每个服务的设置应在services構文中进行描述。
(2)镜像
在每个服务中,可以指定要使用的Docker镜像来运行。
可以通过image指定Docker镜像,或者通过build执行Dockerfile来创建Docker镜像,
然后与docker-compose一起执行,并使用该镜像。
(3)卷
在每个服务运行时,可以指定要挂载的卷。
如果想要持久化数据库等数据,必须进行指定。
在描述示例中,指定了docker管理的卷。
可以按以下方式进行描述。
volumes ホスト側のディレクトリ:dockerコンテナのディレクトリ
※在主机端,可以使用相对路径从docker-compose.yml所在的目录来指定目录。
在docker容器端,必须使用绝对路径来描述目录。
当想要查看有关音量的详细信息时,可以按照以下方式进行确认。
显示音量列表
$ sudo docker volume ls
显示音量的详细信息
$ sudo docker volume inspect ボリューム名
(4)端口
在每个服务运行时,可以在主机(vagrant)和容器之间进行端口转发。
可以指定端口。
请按以下方式进行描述。
ports ホスト側のポート:dockerコンテナのポート
如果服务之间的设置是共同的,可以使用extends来实现共享化。
可以使用extends来继承指定服务的设置。
(6)链接
设置链接后,可以将服务名作为该服务IP地址的别名使用。
服务名将会添加到容器内的/etc/hosts文件中。
例如:
172.17.2.186 db
172.17.2.187 redis
(7)构建
可以指定Dockerfile所在目录的路径。
也可以使用相对路径从docker-compose.yml所在目录进行指定。
如果按照以下方式指定,则以docker-compose.yml所在目录为基准,
引用./Dockerfile。
build: .
如果您想指定一个非”Dockerfile”文件名的Dockerfile,可以按照以下方式进行记录。
context: .
dockerfile: Dockerfile.prod
在上下文中,指定文件的路径,并在Dockerfile中指定Dockerfile的名称。
在此示例中,参考的是./Dockerfile.prod。
(8)命令
可以覆盖默认的命令。
(9)记录日志
如果没有特别设置,默认的驱动程序为json-file,日志将被输出到主机的/var/lib/docker/containers/*/*-json.log文件中。
使用Docker容器
1. 创建Docker容器
如果要真正使用Docker,首先要从创建的镜像中创建Docker容器。
2. 将程序挂载到Docker容器中。
将开发中的程序挂载到已创建的Docker容器的卷中。
进行程序开发
编辑主机端的程序。
由于编辑内容会通过Docker的挂载功能反映到容器端,
可以通过访问Docker容器来检查并同时推进开发,以确认程序的执行内容。
开发环境的共享。
即使在开发过程中更改了开发环境,也可以将Docker容器制作成镜像并上传到DockerHub,从而与其他开发者共享开发环境。Docker镜像不包含卷的内容,因此只需拉取上传到DockerHub的Docker镜像,就可以再次创建相同的容器,并通过挂载开发中的程序轻松在新的开发环境中进行开发。