はじめに
重い腰をあげて前から興味があったDockerの勉強をはじめました。これはそのメモです。
こちらのサイトを参考にハンズオン形式で始めていきます。
Docker勉強メモ
- Docker勉強メモ① DockerインストールからHelloWorld ←ココ
- Docker勉強メモ② Dockerイメージ作ってみる
- Docker勉強メモ③ Dockerfileを作ってDockerイメージ作成からコンテナ起動までやってみる
- Docker勉強メモ④ コンテナ間通信
- Docker勉強メモ⑤ ネットワーク通信
参考
- Docker入門(第一回)~Dockerとは何か、何が良いのか~
- Docker入門(第二回)~Dockerセットアップ、コンテナ起動~
- Amazon Linux2 にdockerをインストールしようとしたらはまった話
環境
Dockerを触る環境はAWSのEC2を使いました。
※AWS ECSを使う記事はこっち → AWS ECR/ECS 勉強メモ① Dockerコンテナ起動
EC2作成時のAMIイメージは ami-045f38c93733dd48d です。
DockerインストールだけLinux2 (amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2 (ami-052652af12b58691f))も使います。
1.Docker入門(第一回)メモ
1-1.Dockerエンジンをインストールする
※ root権限が必要なところは、sudoを使ってます。
1-1-1.CentOS7 ami-045f38c93733dd48d の場合
Dockerを使うにはDockerエンジンが必要らしいのでインストールします。
$ yum-config-manager --enable Extra
$ yum install container-selinux
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
docker-ce.repoが追加されたか確認
ll /etc/yum.repos.d/
Dockerインストール
$ yum install docker-ce
Dockerインストールされたか確認
$ yum list installed | grep docker-ce
こんな感じになるとインストール成功
[centos@ip-172-31-7-38 ~]$ yum list installed | grep docker-ce
containerd.io.x86_64 1.2.13-3.1.el7 @docker-ce-stable
docker-ce.x86_64 3:19.03.7-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:19.03.7-3.el7 @docker-ce-stable
ユーザー centos
が、sudoなくてもdockerコマンド使えるようにする。
以下コマンド実行したら設定反映のためセッションを繋ぎなおす(切断→接続)
$ sudo usermod -a -G docker centos
$ cat /etc/group | grep docker
1-1-2.amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2 (ami-052652af12b58691f) の場合
$ yum update -y
$ amazon-linux-extras install docker
$ service docker start
$ ps -ef |grep docker
1-2.Docketサービスを起動
Dockerサービスを起動
$ systemctl start docker
Dockerサービス起動しているか確認
$ systemctl status docker
こんな感じになると成功
[centos@ip-XXX-XXX-XXX-XXX ~]$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-05 23:01:50 UTC; 6s ago
Docs: https://docs.docker.com
Main PID: 4219 (dockerd)
Tasks: 8
Memory: 42.7M
CGroup: /system.slice/docker.service
└─4219 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476420738Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476435398Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/contai... module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476445516Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.512172262Z" level=info msg="Loading containers: start."
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.696125954Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Da... IP address"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.756440317Z" level=info msg="Loading containers: done."
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.770477383Z" level=info msg="Docker daemon" commit=7141c199a2 graphdriver(s)=overlay2 version=19.03.7
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.770631125Z" level=info msg="Daemon has completed initialization"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.800711711Z" level=info msg="API listen on /var/run/docker.sock"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
※余談※ Dockerサービスの自動起動設定
sudo systemctl enable docker
-ーー 以上でDockerを触る環境が作れた。 ---
2.Dockerコンテナ実行してみる
2-1.挨拶する(hello-world)
新しいことは挨拶から始まる。Hello Worldしてみる。
$ docker run hello-world
実行結果はのせないけど、『Hello from Docker!』とかいろいろ文字がドバっと出たら成功
動いたらもう不要なので削除する。DockerコンテナとDockerイメージの2つを削除。
2-2.Dockerコンテナを削除
Dockerコンテナ削除コマンド
$ docker rm <コンテナ名 or CONTAINER ID>
実行例
sudo docker rm heuristic_wozniak
sudo docker rm 1740d7b07a8a
コンテナ名,CONTAINER IDの確認方法
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1740d7b07a8a hello-world "/hello" About a minute ago Exited (0) About a minute ago heuristic_wozniak
- コンテナ名 → NAMES (今回は
heuristic_wozniak
) - CONTAINER ID → CONTAINER ID (今回は
1740d7b07a8a
)
2-3.Dockerイメージを削除
Dockerイメージ削除コマンド
$ docker rmi <Dockerイメージ名 or IMAGE ID>
イメージ名,IMAGE IDの確認方法
[centos@ip-172-31-3-246 ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 14 months ago 1.84kB
- イメージ名 → REPOSITORY (今回は
hello-world
) - IMAGE ID → IMAGE ID (今回は
fce289e99eb9
)
これで、Dockerへの挨拶と後片付けが完了
3.DockerコンテナでWebサイト構築
Docker Hubに公開されているNginxのDocketイメージを使いWebサーバーを立てる。
3-1.Webサーバー構築
Dockerイメージ取得
$ docker pull nginx
Dockerコンテナ起動
$ docker run -d --name nginx-container -p 8181:80 nginx
オプションの意味
-d バックグラウンド実行
-name コンテナ名
-p <ホスト側のポート>:<コンテナ側のポート>
起動したままになっている
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0672eaa1c9d nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:8181->80/tcp nginx-container
これだけでWebサーバーができた。Docker便利!
http://{ホストのIP}:8181/
でアクセスでWebサイトにアクセスできる。確認できたら後片付けする。
3-2.後片付け
コンテナ停止
sudo docker stop nginx-container
コンテナ停止時の実行ログ
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0672eaa1c9d nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:8181->80/tcp nginx-container
[centos@ip-172-31-3-246 ~]$ sudo docker stop nginx-container
nginx-container
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0672eaa1c9d nginx "nginx -g 'daemon of…" 7 minutes ago Exited (0) 6 seconds ago nginx-container
Dockerコンテナ削除
$ docker rm a0672eaa1c9d
Dockerイメージ削除
$ docker rmi nginx
おまけ:Dockerコマンドメモ
コマンド | 概要 |
---|---|
systemctl start docker | Dockerサービス起動 |
systemctl status docker | Dockerサービス起動確認 |
docker info | Dockerの状態確認 |
docker images | 初期状態の確認 |
docker ps -a | ローカル環境のDockerコンテナの一覧を確認 |
systemctl enable docker | OS起動時にDockerサービス起動 |
docker ps -a | コンテナ一覧 |
docker rm <コンテナ名 or CONTAINER ID> | コンテナイメージ削除 |
docker images | Dockerイメージ一覧 |
docker rmi <コンテナ名 or CONTAINER ID> | Dockerイメージ削除 |
docker pull <イメージ名> | Dockerイメージ取得 |
docker run ・・・ | コンテナ起動 |
docker stop <コンテナ名 or CONTAINER ID> | コンテナ停止 |
docker cp <ホスト側のファイル> <コンテナ名>:<コピー先ディレクトリ> | ホスト→コンテナへデータコピー |
docker cp <コンテナ名>:<コピー元ファイル> <ホストのコピー先ディレクトリ> | コンテナ→ホストへデータコピー |
docker run オプション
オプション | 概要 |
---|---|
-d | バックグラウンド実行 |
-name | コンテナ名 |
-p | <ホスト側のポート>:<コンテナ側のポート> |
-v | |
--link | コンテナ間通信 ※レガシー機能 |