やったこと
事前準備
- DockerをUbuntu上にインストール
- 以下の記事を参考にインストール
- しかし、記事の注意事項に書いてあるとおり商用版Docker EEをリリースしたことにより無償版はDocker CEに名称変更。
- これにより、パッケージ名がdocker-engineからdocker-ceに。インストール手順はほぼ変らないが、気持ち悪いのでアンインストールして再度ceをインストールし直した。
- non-root userでDockerをwork betterにするための設定
- 自動起動の設定はしなかった
講座・ハンズオン
- Dockerの仕組みのかんたんな紹介
- Dockerを使うために最低限理解しておくこと
- Step.1 公開されているイメージを使う
- Step.2 Dockerfileからイメージを作成し使う
- サンプルのDockerfileからphpを実行するAPコンテナを作成
- Step.3 イメージを組み合わせて使う
- サンプルのDockerfileからWebサーバ環境(コンテナの組合せ)を作成
インストール
1. アンインストール
- まず、インストールしてしまったdocker-engineをアンインストール
sudo apt-get purge docker-engine
sudo rm -rf /var/lib/docker
2. SET UP THE REPOSITORY
dockerの公式ドキュメントの通りにインストール
https://docs.docker.com/install/linux/docker-ce/ubuntu/#uninstall-docker-ce
- Update the apt package index:
sudo apt-get update
- install packages to allow apt to use a repository over HTTPS:
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- Verify that you now have the key with the fingerprint
sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
- Set up the stable repository
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
3.INSTALL DOCKER CE
- Update the apt package index.
sudo apt-get update
- Install the latest version of Docker CE
sudo apt-get install docker-ce
- Verify that Docker CE is installed correctly by running the hello-world image.
sudo docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
4. non-root userでDockerをwork betterにするための設定
以下の理由より、インストールしただけだとsudoを常にしないいけなにので、めんどう
The Docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can only access it using sudo. The Docker daemon always runs as the root user.
sudo groupadd docker
- Add your user to the docker group
sudo usermod -aG docker $USER
docker run hello-world
基本コマンド
systemctlコマンド
❯ systemctl start docker.service
❯ systemctl stop docker.service
❯ systemctl status docker.service
dockerコマンド
docker build -t ${REPOSITORY}[:${TAG}] ${PATH}
docker start | stop | restart ${コンテナID}
- 起動中のコンテナプロセス表示(-aオプションで停止中のプロセスも表示)
docker ps
docker logs ${コンテナID}
docker exec ${コンテナID} ${コマンド}
- コンテナへのログイン
exec
はすでに起動しているコンテナでコマンドを実行する。 run
コマンドは新たにコンテナを起動してからそのコンテナでコマンドを実行する。
docker exec -it ${コンテナID} bash
docker rm ${コンテナID}
docker rmi ${イメージID}
- Run a Docker Container
- runコマンドはコマンド実行中のみコンテナを起動。コマンド実行終了後にはコンテナはendする。
docker run ${イメージ名 || イメージID} ${command to run into container}
docker run ubuntu cat /etc/issue
❯ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
- Run an Interactive Session into a Container
- いわゆるコンテナへのログイン
-i
: start an interactive session
-t
: allocates a tty and attaches stdin and stdout
ubuntu
: the image that we used to create the container
bash
(or /bin/bash) : the command that we are running inside the Ubuntu container
docker run -it ubuntu bash
- 起動しているコンテナのセッションからhostのターミナルに戻るには2通りある。
- 1 exit
exit
はコンテナの全てのセッションを終了して、そのコンテナ自体も停止させる
- 2
Ctrl+p
or Ctrl+q
- セッションを維持しつつ、hostのターミナルに戻りたい場合はこのキーを使う
- 新規セッションを作ってこのキーで出たりを繰り返すと、その分だけコンテナが起動しセッションも生成されてしまうので注意。元のセッションへの戻り方は次の項目に記載
❯ docker run -it ubuntu bash
root@7519130e117b:/# exit
exit
~
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
~
❯ docker run -it ubuntu bash
root@f0dffe57d9ce:/#
~ 27s
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0dffe57d9ce ubuntu "bash" 31 seconds ago Up 29 seconds friendly_stonebraker
- 再度、コンテナに戻る方法
- まず、
docker ps
でID or nameを確認する。
- そして以下のコマンドで元のセッションのコンテナに接続し直す
exec
でコンテナに入るのと同じこと?
docker attach ${コンテナID or name}
docker kill ${コンテナID or name}
docker-composeコマンド
- 複数イメージを組合せたコンテナ群(docker-compose.yml)を起動
docker-compose up -d
- docker-composeで起動した各コンテナの状態を確認
docker-compose ps
docker-compose start | stop | restart
docker-compose down
Docker用語
ハンズオン
Step.1 公開されているイメージを使うパターン
- mysqlのイメージを使う
- 使い方はdocker hubのイメージのページにだいたい書いてある
- 実際にpullするイメージのDockerfileはGithubで確認できる
https://hub.docker.com/_/mysql
1. mysqlのdockerイメージ取得
- docker hubのページでsupportされているタグを確認
- タグ指定無しはバージョン
latast
扱いになる
debianベースのmysqlサーバー
構文
docker pull ${REPOSITORY}[:${TAG}]
- バージョン(5.6)を指定してdockerイメージを取得
docker pull mysql:5.6
2. dockerイメージを確認
docker images
3. 取得したdockerイメージからmysqlコンテナ起動
- dockerイメージからコンテナを起動
- 上記で確認した
${REPOSITORY}[:${TAG}]
を指定する
今回の起動コマンドの基本構文は以下の通り
基本構文
docker run -d --name ${NAME} -e MYSQL_ROOT_PASSWORD=my-secret-pw ${REPOSITORY}[:${TAG}]
${NAME}
: コンテナに割り当てたい任意の名前
my-secret-pw
: MySQLのrootユーザーのパスワード
${TAG}
: MySQLのバージョンを明示をする際に付ける
-d
: コンテナをバックグラウンド実行
例
docker run -d --name mysql5.6 -e MYSQL_ROOT_PASSWORD=password mysql:5.6
4. mysqlコンテナ内でコマンド実行
- login shellとしてbashを実行(コンテナにログイン)
docker exec -it some-mysql bash
docker exec -it mysql5.6 ls -al
5. mysqlサーバーのログを見る
docker logs some-mysql
Step.2 Dockerfileからイメージを作成するパターン
1. Dockerfileをビルドしイメージを作成する
docker build -t ${REPOSITORY}[:${TAG}] ${PATH}
docker build -t php .
tag
: イメージのバージョンを明示する際に付ける
2. dockerイメージを確認
docker images
3. 上記で作成したイメージからコンテナを起動する
docker run -d --name ${NAME} ${REPOSITORY}[:${TAG}] -p ${HOST PORT: CONTAINER PORT}
docker run -d --name php -p 80:80 php
Step.3 docker-compose.ymlからイメージを組合せて作成するパターン
sudo docker-compose up –d
- ホストで使用するポートを専有している場合は、サービスを停止しておく
- 今回はMySQL(3306)が起動しており、コンテナ起動失敗した