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