Dockerでイメージ・コンテナを作ってみる

とりあえず、空のubuntuのイメージの雛形を作ってみる。

~/docker$ mkdir ubuntu
~/docker$ cd ubuntu/
~/docker/ubuntu$ vi Dockerfile
~/docker/ubuntu$ cat Dockerfile 
FROM ubuntu
RUN apt-get update && apt-get -y upgrade

~/docker/ubuntu$ docker build -t my-ubuntu .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu
latest: Pulling from library/ubuntu
898c46f3b1a1: Pull complete 
63366dfa0a50: Pull complete 
041d4cd74a92: Pull complete 
6e1bee0f8701: Pull complete 
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for ubuntu:latest
 ---> 94e814e2efa8
Step 2/2 : RUN apt-get update && apt-get -y upgrade
 ---> Running in 50e2bec7ad22
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
(中略)
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Removing intermediate container 50e2bec7ad22
 ---> 41196711534e
Successfully built 41196711534e
Successfully tagged my-ubuntu:latest
~/docker/ubuntu$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-ubuntu           latest              41196711534e        4 minutes ago       124MB
ubuntu              latest              94e814e2efa8        5 weeks ago         88.9MB
~/docker/ubuntu$ 

Dockerfileに元になるイメージとイメージ生成時に実行するコマンドを記述して、docker build コマンドでイメージを実際に作成、docker images コマンドで作成されたイメージを確認。元になった ubuntu イメージと作成した my-ubuntu イメージが存在することを確認。

~/docker/ubuntu$ docker run -it my-ubuntu
root@0420f9cf8484:/# w
 19:18:00 up  1:40,  0 users,  load average: 0.11, 0.15, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root@0420f9cf8484:/# ifconfig
bash: ifconfig: command not found
root@0420f9cf8484:/# apt-get -q install -y net-tools
Reading package lists...
(中略)
Setting up net-tools (1.60+git20161116.90da8a0-1ubuntu1) ...
root@0420f9cf8484:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 120  bytes 205313 (205.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82  bytes 5554 (5.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@0420f9cf8484:/# exit
exit
~/docker/ubuntu$

イメージを起動するが、net-toolsもない状態なので ifconfig もエラーになる。
そこで net-tools をインストールして ifconfig コマンドを実行。当然うまくいくが、そのまま終了してみる。

~/docker/ubuntu$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
0420f9cf8484        my-ubuntu           "/bin/bash"         5 minutes ago       Exited (0) 47 seconds ago                       nifty_volhard
~/docker/ubuntu$ docker rm 0420f9cf8484
0420f9cf8484
~/docker/ubuntu$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
~/docker/ubuntu$ docker run -it my-ubuntu
root@1a256f34b88f:/# ifconfig
bash: ifconfig: command not found
root@1a256f34b88f:/#

終了してもコンテナ自体は残っている。そこで、残っているコンテナを廃棄して、再度起動して ifconfig を実行すると、エラーになる。つまり、前回イメージを起動した状態と同じ状態になっている。

~/docker/ubuntu$ docker run -it my-ubuntu
root@1a256f34b88f:/# ifconfig
bash: ifconfig: command not found
root@1a256f34b88f:/# apt-get -q install -y net-tools
(中略)
root@1a256f34b88f:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 136  bytes 207667 (207.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82  bytes 5554 (5.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
(中略)
root@1a256f34b88f:/# exit
exit
~/docker/ubuntu$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1a256f34b88f        my-ubuntu           "/bin/bash"         3 minutes ago       Exited (0) 38 seconds ago                       hungry_shamir

再度イメージを起動して net-tools をインストールして終了、コンテナIDを確認。

~/docker/ubuntu$ docker commit 1a256f34b88f my-ubuntu
sha256:e2b7322de666afa9b87c841b7641fd558673d1739b00025f1a8591f437b380a0
~/docker/ubuntu$ docker rm 1a256f34b88f 
1a256f34b88f

コミットしてコンテナを廃棄。

~/docker/ubuntu$ docker run -it my-ubuntu
root@34e51c7d376d:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 18  bytes 2406 (2.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
(中略)
root@34e51c7d376d:/# history
    1  ifconfig
    2  apt-get -q install -y net-tools
    3  ifconfig
    4  exit
    5  ifconfig
    6  history
root@34e51c7d376d:/# 

イメージを起動すると、今度は net-tools がインストールされた状態で起動される。historyも残っている。

つまり、以下のような感じで作業していけばよさそう。

  • 失敗したら終了してコンテナ廃棄。再度イメージを起動してコンテナ生成して再トライ。
  • うまく行ったら、節目節目でコミット。
  • 手順がはっきりしたら、history で作業手順確認してDockerfileに記述、イメージ生成してうまく行っているか確認。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)