DockerイメージとDockerコンテナの基本

DockerイメージとDockerコンテナの基本を忘れないようにメモしておきます。 仕様や概要を知る。Dockerイメージから、コンテナを作成する。

Dockerイメージ取得

$ docker image pull gihyodocker/echo:latest
latest: Pulling from gihyodocker/echo
723254a2c089: Pull complete
.
. Digest: sha256:4520b6a66d2659dea2f8be5245eafd5434c954485c6c1ac882c56927fe4cec84 Status: Downloaded newer image for gihyodocker/echo:latest

Dockerコンテナの実行

$ docker container run -t -p 9000:8080 gihyodocker/echo:latest
2019/01/17 02:58:41 start server

動作確認

Dockerコンテナの停止

動作中のコンテナを確認する。
$ docker container ls -q62ee8eafa590
$ docker stop 62ee8eafa590
以下のコマンドでもOK
$ docker stop $(docker container ls -q)

Dockerの操作、いろいろ

動いているコンテナの確認
$ docker ps
起動しているものを全て停止$ docker stop $(docker ps -q)
停止しているコンテナの確認$ docker ps -a
コンテナの削除docker rm [コンテナID]
イメージの削除docker rmi [イメージID]
全てのイメージを削除docker rmi $(docker images -q) -f
停止とイメージ削除を1コマンドで実行する$ cat ~/.bash_profilealias docker-purge='docker stop $(docker ps -q) && docker rmi $(docker images -q) -f'

簡単なアプリケーションとDockerイメージの作成

仕様:

どんなHTTPリクエストに対しても「Hello Docker!!」としてレスポンスをする
8080ポートでサーバーアプリケーションとして動作する。
クライアントからリクエストを受け付けた際は、received requestのログを標準出力に表示する。
コード:main.go
package main import { “fmt” “log” “net/http” } func main() { http.HandleFunc(“/”, func(w http, ResponseWriter, r *http.Request) { log.Println(“received request”) fmt.Fprintf(w, “Hello Docker!!”) }) log.Prntln(“start server”) server := &http.Server{Addr: “:8080”} if err := server.ListenAndServe(); err != nil { log.Println(err) } }

Dockerfile

FROM golang:1.9 RUN mkdir /echoCOPY main.go /echo CMD [“go”, “run”, “echo/main.go”]

FROM: Dockerイメージのベースとなるイメージを指定する DockerHubに公開されている

RUN: Dockerコンテナ内で実行するコマンド

COPY: Dockerを実行しているマシンにファイルやディレクトリをコピーするインストラクション

CMD: コンテナ起動時、1回実行する。

Dockerイメージをビルドする。

$ docker image build -t example/echo:latest .

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM golang:1.9 1.9:
Pulling from library/golang 55cbf04beb70:
.
.
sha256:8b5968585131604a92af02f5690713efadf029cc8dad53f79280b87a80eb1354
Status: Downloaded newer image for golang:1.9 —> ef89ef5c42a9
Step 2/4 : RUN mkdir /echo —> Running in ee2a3d4a30dc Removing intermediate container ee2a3d4a30dc —> bbde1807a7a3
Step 3/4 : COPY main.go /echo —> 81093054da4e
Step 4/4 : CMD [“go”, “run”, “echo/main.go”] —> Running in 32ad4673bdf5 Removing intermediate container 32ad4673bdf5 —> d8f65c5be4e7
Successfully built d8f65c5be4e7 Successfully tagged example/echo:latest

Dockerイメージの確認

$ docker image ls
REPOSITORY               TAG            IMAGE ID                CREATED                 SIZE
example/echo           latest       d8f65c5be4e7    9 minutes ago      750MB
golang                           1.9              ef89ef5c42a9        6 months ago        750MB
gihyodocker/echo    latest        3dbbae6eb30d    12 months ago      733MB

Dockerコンテナの実行

$ docker container run example/echo:latest 2019/01/17 06:38:58 start server

対象となるコンテナを停止

$ docker container stop $(docker container ls –filter “ancestor=example/echo” -q) 66a8884cdc16

コンテナ外からのリクエストに対応する実行

ポートフォワーディングを利用する

内部8080ポートをコンテナ外9000番で公開する。$ docker container run -d -p 9000:8080 example/echo:latest

Dockerのイメージ操作

コマンド参照

docker image –help

  • -f {Dockerfile名} ※デフォルトの”Dockerfile”の名前を変更する。
  • –pull=true ※最新のイメージを取得する。通常は既に取得したイメージを利用する。

イメージの検索

docker search –limit 5 ubuntu

$ docker search –limit 5 ubuntu
NAME                          DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                        Ubuntu is a Debian-based Linux operating sys…   9089                [OK]
rastasheep/ubuntu-sshd        Dockerized SSH service, built on top of offi…   197                                     [OK]
ubuntu-upstart                Upstart is an event-based replacement for th…   95                  [OK]
ubuntu-debootstrap            debootstrap –variant=minbase –components=m…   40                  [OK]
pivotaldata/ubuntu-gpdb-dev   Ubuntu images for GPDB development              0

イメージの取得

docker image pull [option] リポジトリ名[:タグ名]

※タグ名は、多くは、latest

イメージの参照

docker image ls

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
example/echo        latest              f4af6897ed2a        32 minutes ago      750MB
golang              1.9                 ef89ef5c42a9        6 months ago        750MB
gihyodocker/echo    latest              3dbbae6eb30d        12 months ago       733MB

イメージIDののタグ付け

docker image tag 元のイメージ名[:タグ] 新のイメージ名[:タグ]

作成したイメージは、デフォルトで「latest」が付くが、更に更新した場合、以前バージョンとなった場合、レポジトリとタグが消えてしまう。このため、バージョン管理の意味を含めてタグをつける

$ docker image tag example/echo:latest example/echo:1.0.0
(確認)
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
example/echo        1.0.0               f4af6897ed2a        37 minutes ago      750MB
example/echo        latest              f4af6897ed2a        37 minutes ago      750MB
golang              1.9                 ef89ef5c42a9        6 months ago        750MB
gihyodocker/echo    latest              3dbbae6eb30d        12 months ago       733MB

2つあるようにみえるが、実態は同じ

Dockerコンテナの操作

  • Dockerコンテナは、外から見ると仮想環境となる
  • 実行中・停止・破棄 という3つの状態に分類される。 一度実行されたコンテナは、同じイメージを利用したとしても、それぞれ個別の状態を持っている。停止しても、仮想サーバーが停止した状態と同じで実行もできる。

コンテナの作成と実行

docker container run [options] イメージ名[:タグ] [コマンド] [コマンドの引数]

代表的なオプション ※基本、以下オプションを付けて実行すること。

  • -d バックグランドで実行する。
  • -p 9000:8080 ポートフォワードを行う。
  • -it コンテナのshellに接続

(alpinelinuxのイメージ取得)
$ docker image pull alpine:3.7
(alpinelinuxのコンテナ実行し、コマンドライン)

$ docker container run -it alpine:3.7 /
# (alpinelinuxのコンテナ実行し、uname -a の実行結果を返す)

$ docker container run -it alpine:3.7 uname -a Linux e36b6c40aa37 4.15.0-29-generic
#31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 Linux

  • –name [コンテナ名]

$ docker container run -d -p 9001:8080 –name echo1 example/echo:latest ca4cfefdf2c9bd4a1db6acbe8ead6c8152375f63a2215adb581f1c2e162b1cfc

$ docker container run -d -p 9002:8080 –name echo2 example/echo:latest 72ecbd862402db9c632b681c6623ec96dd445c9489dd5673426d6505f69350c0

$ docker container ls
CONTAINER ID  IMAGE            COMMAND              CREATED             STATUS              PORTS                    NAMES 72ecbd862402    example/echo:latest  “go run /echo/main.go”  7  ago   Up 6 seconds   0.0.0.0:9002->8080/tcp   echo2 ca4cfefdf2c9       example/echo:latest   “go run /echo/main.go”  16 ago Up 15 seconds 0.0.0.0:9001->8080/tcp   echo1$ docker container ls –filter “name=echo1”CONTAINER ID  IMAGE            COMMAND              CREATED             STATUS              PORTS                    NAMES
ca4cfefdf2c9       example/echo:latest   “go run /echo/main.go”  16 ago Up 15 seconds 0.0.0.0:9001->8080/tcp   echo1

コンテナの停止と再起動、破棄

docker container stop/restart/rm [コンテナID又はコンテナ名]

$ docker container stop echo1 echo1 $ docker container restart echo1 echo1 (破棄は、コンテナを止めてから、実行する) $ docker container rm echo1echo1

コンテナの(停止を含めた)一覧

docker container ps -a

$ docker container ps -a

CONTAINER ID    IMAGE         COMMAND    CREATED               STATUS                                      PORTS           NAMES e36b6c40aa37    alpine:3.7    “uname -a”    21 minutes ago  Exited (0) 21 minutes ago     brave_hugle cf7d2a393761     alpine:3.7    “/bin/sh”         22 minutes ago  Exited (0) 21 minutes ago     confident_dubinsky

$ docker container rm e36b6c40aa37 cf7d2a393761
e36b6c40aa37 cf7d2a393761

$ docker container ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナの標準出力の取得

docker container logs [options] [コンテナID又はコンテナ名]

※-f オプションを付けると、標準出力に出し続ける。

実行中のコンテナでのコマンド実行

docker container exec [options] [コンテナID又はコンテナ名]

$ docker container run -t -d -p 9002:8080 –name echo –rm example/echo:latest a2038a1a36476ddbfda4667386be52b2041a4710a1188fac6a1f03ec74d96874

(実行中のコンテナechoに、pwdを実行し標準出力に出す)
$ docker container exec echo pwd/go

(実行中のコンテナをsshログインしたようにする)
$ docker container exec -it echo sh
# pwd /go

運用管理コマンド

  • 不要な(停止した)コンテナを一括削除 docker container prune
  • 不要な(停止した)イメージを一括削除 docker image prune
  • 不要な(停止した)コンテナ、イメージ、ネットワークを一括削除 docker system prune
  • 利用状況の取得 docker container stats
CONTAINER ID    NAME       CPU %      MEM USAGE / LIMIT     MEM %          NET I/O             BLOCK I/O           PIDS ba59bb412c81     echo          0.00%        9.953MiB / 1.941GiB      0.50%            836B / 0B          111kB / 8.19kB      10

マルチコンテナ(Docker Compose)

サーバー作業環境の設定/確認

(ソフトの導入)
$ sudo apt-get install docker-compose

(バージョン確認)
$ docker-compose version
docker-compose version 1.17.1, build unknown docker-py version: 2.5.1 CPython version: 2.7.15rc1 OpenSSL version: OpenSSL 1.1.0g  2 Nov 2017

基本的なDockerComposeの利用方法(1)

以下のコマンドと同様の内容をdocker-compose.ymlに記載する。

$ docker container run -d -p 9000:8080 –name echo example/echo:latest

version: “3”
services:
        echo:
                image: example/echo:latest
                ports:
                        – 9000:8080

(DockerComposeの実行)$ docker-compose up -d
Creating network “composep72_default” with the default driver
Creating composep72_echo_1 …
Creating composep72_echo_1 … done
(Dockerコンテナの起動確認)
$ docker container ls
CONTAINER ID   IMAGE                 COMMAND              CREATED             STATUS              PORTS                    NAMES
1c94779a3f48  example/echo:latest “go run /echo/main.go”  21 ago  Up 20  0.0.0.0:9000->8080/tcp composep72_echo_1

(DockerComposeの停止)$ docker-compose down

Stopping composep72_echo_1 … doneRemoving composep72_echo_1 … doneRemoving network composep72_default

基本的なDockerComposeの利用方法(2)Buildも含む

main.go Dockerfile docker-compose.yml をセットにして実行する。

version: “3”
services:
        echo:
                build: .
                ports:
                        – 9000:8080

(DockerComposeの実行)
$ docker-compose up -d
Creating network “test_default” with the default driver
Building echo
Step 1/4 : FROM golang:1.9
—> ef89ef5c42a9
Step 2/4 : RUN mkdir /echo
—> Using cache
—> 8bcd6e1f03c1
Step 3/4 : COPY main.go /echo
—> 05e388abd1ef
Step 4/4 : CMD [“go”,”run”,”/echo/main.go”]
—> Running in 64d6a5831372
Removing intermediate container 64d6a5831372
—> 8f68a2587199
Successfully built 8f68a2587199
Successfully tagged test_echo:latest
WARNING: Image for service echo was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up –build`.
Creating test_echo_1 …
Creating test_echo_1 … done


(Dockerコンテナの起動確認)
$ docker container ls
CONTAINER ID      IMAGE               COMMAND     CREATED             STATUS              PORTS                    NAMES
eb053d225689 test_echo  “go run /echo/main.go”   44  ago      Up 44 minutes       0.0.0.0:9000->8080/tcp   test_echo_1(DockerComposeの停止)$ docker-compose downStopping test_echo_1 … doneRemoving test_echo_1 … doneRemoving network test_default

 

タイトルとURLをコピーしました