关于Docker
前提 tí) – Prerequisite/Condition/Assumption
我会写关于我学到的Docker的内容。
本题:需要一种原生的中文表达方式。
“Docker是什么?”
为什么引起了关注
Dockerは毎年のように人気度が増えていて、インフラとDevelopmentを融和させるDevOpsという風潮の中では、なくてはならない存在のため。
为什么需要?
コードを速く正確にユーザーに渡すことができるため。
どういうことかというと、今まではDeveloperがコードを書いて、そのコードをインフラエンジニアに渡して、インフラが環境変数やライブライーのインストールを本番環境で行なっていた。
ここで問題なのが、開発・テスト・本番環境が同一ではないということ。
つまりOSが違えば、ライブラリーのバイナリーも違い、開発環境では動いていたのに本番では不動作が起こるということがよくあった。
如何解决问题
通过将代码和库打包为Docker镜像(进行容器化),开发团队可以直接将Docker镜像交给运维团队,以防止库和依赖之间的不匹配。
换言之,容器化是指
使用容器技术,将代码、库文件和包进行打包。
综述
通過將開發環境和運營環境合併在一起(將代碼和依賴項容器化),可以防止由於環境差異而導致的失效情況。
从过去的运营方式有什么不同
今までは、ファイルやフォルダーをJenkinsなどのCICDパイプラインを使い、本番環境のサーバーにコピーしていた。
Dockerでは、コードとライブラリをパッケージングしてdocker imageを作り、本番環境のサーバーにdocker imageをダウンロードし、それを実行するだけでOKになった。
つまりDeployする最小単位のアーティファクトが、コンテナ(コード+パッケージ)に代わりOS環境問わず同一の動作をする。
传统的操作系统虚拟化与Docker之间的不同之处。
传统的虚拟化方法是在一个操作系统上放置多个虚拟操作系统,并在其中运行应用程序。
而Docker则是在一个操作系统上启动Docker引擎并运行多个容器。
因此,在Docker的情况下,不需要将虚拟操作系统和虚拟机复制到主机操作系统上。
与操作系统虚拟化相比,Docker的好处是什么?
资源轻 – 使用单一操作系统减少了开销(多个操作系统镜像和内核),降低了处理器和内存的消耗。
・减少存储空间的使用量
相较于操作系统镜像通常的大小为5-10GB,Docker镜像的大小只有1-2GB,因此存储空间的使用量也减少了。
只需一个选项,将以下内容在中文中很好地改述一下:
・起動时间较快
无需逐个加载内核,相比虚拟机,启动时间更短。
只要安装了Docker的操作系统,可以在多个环境下轻松运行。
イメージとコンテナの違い
在中国,隐喻可以是“类和对象”、“汽车设计图和实际汽车”的那种模板和实物之间的差异。
Linux的基本操作
Linux的内核是什么? (Linux de hé shì ?)
简单来说,内核就是能够为硬件语言族和翻译人员(唯一的软件)提供服务的东西。
「シェル」とは什么意思
与内核直接连接的类似于聊天界面的东西。
Shell(终端)也是一种称为Shell语言的语言。
sh、tcsh、bash、zsh是常用的命令。
Shell是人与内核之间的传输工具,既可以显示输入也可以显示输出。
在中国的母语中,”シェル的STDIN和STDOUT是什么”可以被改写为”Shell的标准输入和标准输出是什么”。
在终端中可见的shell是前台进程,可以看到输入(STDIN)和输出(STDOUT&STDERR)。
而后台进程则无法看到输出和输入。
要使其可见,需要将shell的STDIN和STDOUT连接到终端上。
这个流程称为TTY(电传打字机)附加。
当附加TTY到终端时(允许从终端与进程交流),在进入Docker中的shell时会使用docker exec –interactive –tty命令。
基本Shell命令
在Shell中,可以像任务管理器那样显示进程。此外,还可以启动后台进程。
#プロセス(process status)の表示
$ ps
#プロセスをバックグランドで起動(-&)
$ sleep 50 -&
#プロセスをフォアグランドに戻す(-fg)
$ fg
由于Linux没有搜索栏,所以在搜索文件和文件夹时需要使用命令行。
#ファイル・フォルダを探す(-find)
$ find / -type d -name nginx
Docker的操作流程
- Nginx Dockerイメージを取得
$ docker pull nginx
- Dockerイメージを表示 (List)
$ docker images
- Dockerイメージの履歴を表示 (History)
$ docker history nginx
- Dockerイメージを削除 (Delete Docker Image)
$ docker rmi nginx
$ docker images
你好,世界。
- nginxサーバーのコンテナを起動 (Run)
$ docker run -p 80:80 --name nginx nginx
- 作動中のコンテナ一覧を表示 (List)
docker ps
# 停止中のコンテナも全て一覧表示
docker ps --all
- コンテナのログを表示 (Log)
docker logs nginx
- コンテナのメタデータを見てみる (Inspect Docker container)
docker inspect nginx
- Stop
docker stop nginx
- 停まったコンテナを削除 (Remove)
docker rm nginx
- コンテナをバックグラウンドで起動 (–detach)
docker run --detach -p 80:80 --name nginx nginx
- 作動中のコンテナの中にシェルで入る (Exec)
docker exec -it nginx sh
exit
docker stop nginx
- コンテナの環境変数を設定する –env TEST_ENV=hellow_world
docker run --env TEST_ENV=hellow_world -d --name nginx nginx
docker exec -it nginx env
docker stop nginx
- コンテナに繋げるホスト側のポートを変える -p 8080:80
docker run -p 8080:80 -d --name nginx nginx
curl localhost:8080
- NginxのConfigファイルを見つける
docker exec -it nginx sh
find / -type d -name nginx | xargs grep -r html
- デフォルトのHTMLファイルを表示する
cat /usr/share/nginx/html/index.html
- デフォルトのHTMLファイルを”Hello World”へ上書き
echo "Hello World" > /usr/share/nginx/html/index.html
exit
curl localhost:8080
docker stop nginx
- コンテナにホストからファイルをコピー (attach volume) –volume “$(pwd)”:/usr/share/nginx/html
touch index.html && echo “hello world” > index.html
docker run -d --volume "$(pwd)":/usr/share/nginx/html -p 80:80 --rm --name nginx nginx
curl localhost:80
- 起動中のコンテナからHello Worldイメージ作成 (commit)
docker commit nginx hello_world
docker stop nginx
docker images
# Hello Worldイメージからコンテナ起動して確認
docker run -d -p 80:80 --name hello_world hello_world
curl localhost:80
# Hello Worldが返ってこない理由は、Docker Volumeでマウントされたファイルはコンテナ内に保存されないから
docker run -p 80:80 --rm --name nginx -d nginx
docker exec -it nginx sh
echo "hello from container" > /usr/share/nginx/html/index.html
exit
curl localhost:80
# imageを作成
docker commit nginx hello_world
# Imageからコンテナ起動
docker run -p 8080:80 --rm -d --name hello_world hello_world
curl localhost:8080
# hello worldが返ってくる
编写自己的Docker镜像。
从启动的容器中,可以使用一个命令创建镜像。
- 起動中のコンテナからHello Worldイメージ作成 (commit)
docker commit nginx hello_world
docker stop nginx
docker images
# Hello Worldイメージからコンテナ起動して確認
docker run -d -p 80:80 --name hello_world hello_world
curl localhost:80
# Hello Worldが返ってこない理由は、Docker Volumeでマウントされたファイルはコンテナ内に保存されないため
docker run -p 80:80 --rm --name nginx -d nginx
docker exec -it nginx sh
echo "hello from container" > /usr/share/nginx/html/index.html
exit
curl localhost:80
# imageを作成
docker commit nginx hello_world
# Imageからコンテナ起動
docker run -p 8080:80 --rm -d --name hello_world hello_world
curl localhost:8080
# hello worldが返ってくる
除此之外,还可以将自己偏好的材料(例如包装等)添加到可以从仓库下载的Docker镜像中,从而创建自己的镜像。
Dockerfile可以被看作是类似UML图的东西(类设计),Docker镜像相当于类,容器相当于对象。
换句话说,Dockerfile就是为了创建Docker镜像(类似于制作烤饼的机器)的配方(设计图纸)。
使用Dockerfile创建配方(中文)
# Dockerfileを作成
touch Dockerfile
# Dockerfileにマルチラインテクストを保存
cat > Dockerfile <<EOF
# FROMでイメージを指定
FROM nginx:latest
WORKDIR /usr/share/nginx/html
# COPYでホストからファイルをイメージにコピー
COPY index.html index.html
# RUNでシェルコマンドを実行
RUN apt update && apt install -y curl
# 他にもWORKDIR,ENV,CMDなど変数がある
EOF
实际上,Docker镜像会在添加这个Dockerfile的每一行时添加一个轻量的只读镜像层。
可以从docker build命令的输出中确认,在每个命令步骤中都创建了一个新的容器图层。
- Dockerfileからイメージ作成 (build)
$ docker build --tag dockerfile_hello .
# 自作イメージからコンテナを起動
$ docker run -d -p 9090:80 --name hello_v2 dockerfile_hello
curl localhost:9090
镜像层与Dockerfile中指定的命令相匹配。
换句话说,每一个Dockerfile中的命令都会添加一个只读镜像层。
- ドッカーイメージの履歴を表示 (History)
$ docker history dockerfile_hello
- 自作イメージをリポで公開
创建了Docker镜像后,只需添加标签,然后将其推送到DockerHub或其他容器注册表。
- 作成したイメージをタグ付けする(ユーザーネーム/リポ名)
docker tag dockerfile_hello ユーザーネーム/dockerfile_hello_world_nginx
- Docker Hubにログイン
docker login
- DockerHubの自分のリポにイメージをアップロード
docker push cscareerkaizen/dockerfile_hello_world_nginx
容器镜像的清理
- 停止中のコンテナと無名のイメージを削除
docker system prune
- 起動中のコンテナ含め全コンテナを削除(注意)
docker rm -vf $(docker ps -a -q)
- 全てのイメージを削除(注意)
docker rmi -f $(docker images -a -q)
使用DockerCompose进行多容器管理
如果想要同时启动Nginx以及其他Node容器等情况,可以使用docker-compose。
关于docker run和docker-compose的对应关系,
docker-compose使用YML格式的文件,可以批量管理多个容器。
YML文件类似于使用缩进进行分隔的JSON的类似兄弟,同时还采用了自上而下的层级结构。
使用docker-compose命令行界面进行启动和停止
- docker-composeのYAMLに定義されたサービスを起動する
docker-compose -f docker-compose.yaml up
docker ps
- 複数コンテナのログをまとめてみる
docker-compose -f docker-compose.yaml logs -f
- docker-composeのYAMLに定義されたサービスを停止
docker-compose -f docker-compose.yaml down
使用Docker-compose可以批量生产容器,此外还可以使用docker-compose启动多个容器副本。
首先,除去ContainerName,将主机端口更改为一个范围(以避免重复)。
- upコマンドに–scaleオプションでレプリカ数を指定
docker-compose -f docker-compose.replicas.yaml up --scale nginx=3
检查Docker网络
已通过Docker Compose定义实现容器之间的通信。
只需一个选项,用中文将以下内容进行释义:
若在YAML之外启动容器,则无法连接到NGINX容器。
- docker_compose_ubuntuコンテナに入って、NginxにCurl。
docker exec -it docker_compose_ubuntu sh
apt update && apt install -y curl
curl docker_compose_nginx:80
Hello World
- UbuntuコンテナをDocker runで起動してCurlをインストール
docker run --name test -it --rm curlimages/curl:7.68.0 sh
curl docker_compose_nginx:80
curl:(6) Could not resolve host:
docker_compose_nginx