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:
[code] FROM ubuntu MAINTAINER Sebastian Czech RUN apt-get update && apt-get install -y ruby [/code]
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