W Docker Hub dostępnych jest wiele obrazów oficjalnych i nie tylko, które można pobrać i uruchomić. Istnieje również możliwość utworzenia obrazu w Docker, który przygotować można na podstawie już istniejących. Wbrew pozorom zbudowanie własnego obrazu nie jest czasochłonne. Poniżej przedstawiam jak w kilkunastu krokach takich obraz przygotować.
Przykład budowy nowego obrazu będę realizować na poniższej wersji Docker’a:
bash-3.2$ docker version Client: Version: 1.11.1 API version: 1.23 Go version: go1.5.4 Git commit: 5604cbe Built: Tue Apr 26 23:44:17 2016 OS/Arch: darwin/amd64 Server: Version: 1.11.1 API version: 1.23 Go version: go1.5.4 Git commit: 5604cbe Built: Wed Apr 27 00:34:20 2016 OS/Arch: linux/amd64
Przed przystąpieniem do budowy obrazu lokalnie mam pobrane 4 oficjalne obrazy:
bash-3.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE rabbitmq latest 4e073477bc18 3 weeks ago 177.1 MB jenkins latest 77bd697ef2c3 4 weeks ago 710.1 MB redis latest be9c5a746699 4 weeks ago 184.9 MB mongo latest a55d8a328b43 5 weeks ago 313.1 MB
Do utworzenia nowego obrazu potrzeba pobrać nowy obraz Linux’a, co można wykonać poprzez próbę wykonania polecenia w obrazie, który nie jest pobrany – Docker automatycznie wyszuka i pobierze obraz:
bash-3.2$ docker run centos cat /etc/system-release Unable to find image 'centos:latest' locally latest: Pulling from library/centos a3ed95caeb02: Pull complete da71393503ec: Pull complete Digest: sha256:1a62cd7c773dd5c6cf08e2e28596f6fcc99bd97e38c9b324163e0da90ed27562 Status: Downloaded newer image for centos:latest CentOS Linux release 7.2.1511 (Core) bash-3.2$ docker run -it centos bash [root@36662f780361 /]# df -h Filesystem Size Used Avail Use% Mounted on none 193G 2.6G 181G 2% / tmpfs 1002M 0 1002M 0% /dev tmpfs 1002M 0 1002M 0% /sys/fs/cgroup /dev/sda1 193G 2.6G 181G 2% /etc/hosts shm 64M 0 64M 0% /dev/shm [root@36662f780361 /]# uname -a Linux 36662f780361 4.4.8-boot2docker #1 SMP Mon Apr 25 21:57:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [root@36662f780361 /]# exit exit
Obraz można również pobrać za pomocą polecenia pull
:
bash-3.2$ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 5ba4f30e5bea: Pull complete 9d7d19c9dc56: Pull complete ac6ad7efd0f9: Pull complete e7491a747824: Pull complete a3ed95caeb02: Pull complete Digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4 Status: Downloaded newer image for ubuntu:latest bash-3.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 904d6c400333 10 days ago 196.8 MB ubuntu latest 2fa927b5cdd3 2 weeks ago 122 MB rabbitmq latest 4e073477bc18 3 weeks ago 177.1 MB jenkins latest 77bd697ef2c3 4 weeks ago 710.1 MB redis latest be9c5a746699 4 weeks ago 184.9 MB mongo latest a55d8a328b43 5 weeks ago 313.1 MB
W przykładzie zakładam, że chcę utworzyć obraz Linux’a z zainstalowanym ruby
. Zanim przystąpię do instalacji ruby
, sprawdzam, czy taka komenda nie jest już dostępna w pobranym obrazie:
bash-3.2$ docker run --rm ubuntu ruby -e 'puts 3 + 6' docker: Error response from daemon: Container command 'ruby' not found or does not exist..
Ze względu na jej brak, instalacja odpowiednich paczek musi zostać wykonana z shell’a systemu w obrazie Linux’a:
bash-3.2$ docker run -it ubuntu /bin/bash root@44688ab07d42:/# apt-get update Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB] Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [94.5 kB] Get:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB] ... Fetched 23.4 MB in 5s (4306 kB/s) Reading package lists... Done root@44688ab07d42:/# apt-get install ruby Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: ca-certificates fonts-lato javascript-common libffi6 libgdbm3 libgmp10 libjs-jquery libruby2.3 libssl1.0.0 libyaml-0-2 openssl rake ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.3 rubygems-integration unzip zip Suggested packages: apache2 | lighttpd | httpd ri ruby-dev bundler The following NEW packages will be installed: ca-certificates fonts-lato javascript-common libffi6 libgdbm3 libgmp10 libjs-jquery libruby2.3 libssl1.0.0 libyaml-0-2 openssl rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.3 rubygems-integration unzip zip 0 upgraded, 22 newly installed, 0 to remove and 15 not upgraded. Need to get 8492 kB of archives. After this operation, 34.6 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 libgdbm3 amd64 1.8.3-13.1 [16.9 kB] Get:2 http://archive.ubuntu.com/ubuntu xenial/main amd64 fonts-lato all 2.0-1 [2693 kB] Get:3 http://archive.ubuntu.com/ubuntu xenial/main amd64 libyaml-0-2 amd64 0.1.6-3 [47.6 kB] ... done.
W czasie instalacji można sprawdzić na maszynie, na której uruchomiliśmy Docker’a, czy proces bash
jest aktywny:
bash-3.2$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 44688ab07d42 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes small_knuth
Po zakończeniu instalacji paczki, należy zmiany zatwierdzić i zdefiniować nazwę nowego obrazu:
bash-3.2$ docker commit 44688ab07d42 ubuntu/ruby:v1 sha256:9e55ae73d656b0ad93e4a86c29f6030f5277bce2279a03ce40e841cfe8d757fd
Nowo utworzony obraz jest już dostępnych w Docker:
bash-3.2$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu/ruby v1 9e55ae73d656 4 seconds ago 194.4 MB centos latest 904d6c400333 10 days ago 196.8 MB ubuntu latest 2fa927b5cdd3 2 weeks ago 122 MB rabbitmq latest 4e073477bc18 3 weeks ago 177.1 MB jenkins latest 77bd697ef2c3 4 weeks ago 710.1 MB redis latest be9c5a746699 4 weeks ago 184.9 MB mongo latest a55d8a328b43 5 weeks ago 313.1 MB
Co można sprawdzić uruchamiając polecenie:
bash-3.2$ docker run --rm ubuntu/ruby:v1 ruby -e 'puts 3 + 6' 9
Istnieje drugi sposób przygotowania własnego obrazu – w tym celu należy utworzyć plik Dockerfile
o zawartości:
FROM ubuntu MAINTAINER Sebastian Czech RUN apt-get update && apt-get install -y ruby
i uruchomić proces budowania:
# docker build -t ubuntu/ruby2:v1 . Sending build context to Docker daemon 7.68 kB Step 1 : FROM ubuntu ---> 2fa927b5cdd3 Step 2 : MAINTAINER Sebastian Czech ---> Running in c83d16ba40e6 ---> 2a957f1eafdc Removing intermediate container c83d16ba40e6 Step 3 : RUN apt-get update && apt-get install -y ruby ---> Running in 781702a84d35 ..... ---> b49e21c3f3ed Removing intermediate container 781702a84d35 Successfully built b49e21c3f3ed
Obraz utworzony drugim sposobem można sprawdzić podobnie jak poprzedni za pomocą polecenia:
bash-3.2$ docker run --rm ubuntu/ruby2:v1 ruby -e 'puts 3 + 6' 9