とりあえず、空の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に記述、イメージ生成してうまく行っているか確認。