如何使用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元となるDockerイメージの指定MAINTAINER作成者の情報RUNコマンドの実行COPYファイル/ディレクトリの追加CMDコンテナーの実行コマンド 1ENTRYPOINTコンテナーの実行コマンド 2WORKDIR作業ディレクトリの指定ENV環境変数の指定USER実行ユーザーの指定EXPOSEポートのエクスポートVOLUMEボリュームのマウント
以下是記述例:

请具体如下所述。

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格式进行描述。

常用的句式一覽
構文用途services各serviceの設定を束ねるimage元となるDockerイメージの指定environment環境変数の指定volumesボリュームの指定portsポートフォワードの指定extends共通の設定を利用するサービスを指定commandデフォルトのコマンドを上書きするlinksリンクするサービスを指定buildDockerfileのあるディレクトリのパスを指定loggingログを出力する場所を指定
以下是記述例:
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镜像,就可以再次创建相同的容器,并通过挂载开发中的程序轻松在新的开发环境中进行开发。

广告
将在 10 秒后关闭
bannerAds