Utworzenie obrazu w Docker

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.