W pierwszej części opisałem proces instalacji, tworzenia i usuwania kontenerów docker.
W tej części natomiast skupie się na tym jak utworzyć własny obraz – do dzieła!

Naszym celem jest utworzenie obrazu z systemem ubuntu oraz serwerem apache. Stwórzmy więc plik o nazwie Dockerfile i treści:

FROM debian:latest
MAINTAINER Marek

RUN apt-get update && \
    apt-get install -y apache2 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_LOG_DIR /var/log/apache2

RUN mkdir -p /var/run /var/run/apache2 /var/lock/apache2 /var/log

EXPOSE 80

CMD ["apache2","-D","FOREGROUND"]

Wyjaśnienie poszczególnych zmiennych:

  • FROM – nazwa obrazu bazowego na podstawie którego tworzymy nasz kontener
  • MAINTAINER – twórca obrazu
  • RUN – polecenie/polecenia wykonywane po utworzeniu obrazu
  • ENV – ustawiamy zmienne środowiskowe
  • EXPOSE – podajemy port na który będzie przekierowane nasłuchiwanie kontenera na adresie ip serwera
  • CMD – komenda która zostanie wykonana odrazu po uruchomieniu serwera.

To tylko niektóre ze zmiennych których można używać podczas tworzenia kontenera – pełna lista zmiennych jest pod tym linkiem.

Aby stworzyć obraz wpisujemy ( w katalogu gdzie jest nasz plik Dockerfile) polecenie:

docker build . -t marek/apache2

W konsoli wygląda to tak:

[root@localhost ~]# docker build . -t marek/apache2
Sending build context to Docker daemon  17.92kB
Step 1/13 : FROM debian:latest
latest: Pulling from library/debian
05d1a5232b46: Pull complete 
Digest: sha256:07fe888a6090482fc6e930c1282d1edf67998a39a09a0b339242fbfa2b602fff
Status: Downloaded newer image for debian:latest
 ---> f2aae6ff5d89
Step 2/13 : MAINTAINER Marek
 ---> Running in 73572f96499b
Removing intermediate container 73572f96499b
 ---> 109ead9e5062
Step 3/13 : RUN apt-get update &&     apt-get install -y apache2 &&     apt-get clean &&     rm -rf /var/lib/apt/lists/*
 ---> Running in 12273a2134f3
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:2 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [441 kB]
Get:4 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:6 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [5148 B]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7851 kB in 5s (1527 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  apache2-bin apache2-data apache2-utils bzip2 file libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap libexpat1 libffi6 libgdbm3 libgmp10
  libgnutls30 libgpm2 libhogweed4 libicu57 libldap-2.4-2 libldap-common
  liblua5.2-0 libmagic-mgc libmagic1 libncurses5 libnghttp2-14 libp11-kit0
  libperl5.24 libprocps6 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsqlite3-0 libssl1.0.2 libssl1.1 libtasn1-6 libxml2 mime-support netbase
  openssl perl perl-modules-5.24 procps psmisc rename sgml-base ssl-cert
  xml-core xz-utils
Suggested packages:
  www-browser apache2-doc apache2-suexec-pristine | apache2-suexec-custom
  bzip2-doc gnutls-bin gpm libsasl2-modules-gssapi-mit
  | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp
  libsasl2-modules-sql ca-certificates perl-doc libterm-readline-gnu-perl
  | libterm-readline-perl-perl make sgml-base-doc openssl-blacklist debhelper
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils bzip2 file libapr1
  libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libexpat1 libffi6
  libgdbm3 libgmp10 libgnutls30 libgpm2 libhogweed4 libicu57 libldap-2.4-2
  libldap-common liblua5.2-0 libmagic-mgc libmagic1 libncurses5 libnghttp2-14
  libp11-kit0 libperl5.24 libprocps6 libsasl2-2 libsasl2-modules
  libsasl2-modules-db libsqlite3-0 libssl1.0.2 libssl1.1 libtasn1-6 libxml2
  mime-support netbase openssl perl perl-modules-5.24 procps psmisc rename
  sgml-base ssl-cert xml-core xz-utils
0 upgraded, 48 newly installed, 0 to remove and 0 not upgraded.
Need to get 24.8 MB of archives.
After this operation, 104 MB of additional disk space will be used.
.......
....... 
......
Setting up file (1:5.30-1+deb9u2) ...
Setting up libhogweed4:amd64 (3.3-1+b2) ...
Setting up libp11-kit0:amd64 (0.23.3-2) ...
Setting up libgnutls30:amd64 (3.5.8-5+deb9u3) ...
Setting up libldap-2.4-2:amd64 (2.4.44+dfsg-5+deb9u2) ...
Setting up libaprutil1-ldap:amd64 (1.5.4-3) ...
Setting up apache2-bin (2.4.25-3+deb9u5) ...
Setting up apache2 (2.4.25-3+deb9u5) ...
Enabling module mpm_event.
Enabling module authz_core.
Enabling module authz_host.
Enabling module authn_core.
Enabling module auth_basic.
Enabling module access_compat.
Enabling module authn_file.
Enabling module authz_user.
Enabling module alias.
Enabling module dir.
Enabling module autoindex.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module filter.
Enabling module deflate.
Enabling module status.
Enabling module reqtimeout.
Enabling conf charset.
Enabling conf localized-error-pages.
Enabling conf other-vhosts-access-log.
Enabling conf security.
Enabling conf serve-cgi-bin.
Enabling site 000-default.
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for sgml-base (1.29) ...
Removing intermediate container 12273a2134f3
 ---> c0d96b013b1c
Step 4/13 : ENV APACHE_RUN_USER www-data
 ---> Running in 3d35f5dcb903
Removing intermediate container 3d35f5dcb903
 ---> 92110682bb6e
Step 5/13 : ENV APACHE_RUN_GROUP www-data
 ---> Running in 29eb6f62fa6d
Removing intermediate container 29eb6f62fa6d
 ---> 89bc47c811ba
Step 6/13 : ENV APACHE_LOG_DIR /var/log/apache2
 ---> Running in 60cc3e6c7729
Removing intermediate container 60cc3e6c7729
 ---> 968415bc33d4
Step 7/13 : ENV APACHE_PID_FILE /var/run/apache2.pid
 ---> Running in 0e0219dfccd6
Removing intermediate container 0e0219dfccd6
 ---> c186c6c190ae
Step 8/13 : ENV APACHE_RUN_DIR /var/run/apache2
 ---> Running in 0c7d7f9a7960
Removing intermediate container 0c7d7f9a7960
 ---> 17a6f443c342
Step 9/13 : ENV APACHE_LOCK_DIR /var/lock/apache2
 ---> Running in 6c00eadc7fd6
Removing intermediate container 6c00eadc7fd6
 ---> 60ffa3b17e2f
Step 10/13 : ENV APACHE_LOG_DIR /var/log/apache2
 ---> Running in 2979495b6a42
Removing intermediate container 2979495b6a42
 ---> 8c74264a2a93
Step 11/13 : RUN mkdir -p /var/run /var/run/apache2 /var/lock/apache2 /var/log
 ---> Running in cfea1280e6e9
Removing intermediate container cfea1280e6e9
 ---> 62b9131bce6a
Step 12/13 : EXPOSE 80
 ---> Running in 6301649a3c64
Removing intermediate container 6301649a3c64
 ---> aa24cd0b20a6
Step 13/13 : CMD ["apache2","-D","FOREGROUND"]
 ---> Running in e4be2ed8473b
Removing intermediate container e4be2ed8473b
 ---> 8ed8fdfc06e0
Successfully built 8ed8fdfc06e0
Successfully tagged marek/apache2:latest
[root@localhost ~]# 

Jak widać obraz utworzył się poprawnie – sprawdźmy czy jest on widoczny:

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
marek/apache2       latest              8ed8fdfc06e0        10 seconds ago      204MB
hello-world         latest              4ab4c602aa5e        2 weeks ago         1.84kB
ubuntu              latest              cd6d8154f1e1        2 weeks ago         84.1MB
debian              latest              f2aae6ff5d89        2 weeks ago         101MB
google/cadvisor     latest              75f88e3ec333        9 months ago        62.2MB
[root@localhost ~]#

Możemy teraz utworzyć kontener na podstawie naszego obrazu i sprawdzić czy działa poprawnie:

[root@localhost ~]# docker run -d --name obraztestowy -p 80:80 marek/apache2
2c9138a818feeabd5fb5d08cd69a46a2b279bf868f9d59194639c15044f3e7db
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
2c9138a818fe        marek/apache2            "apache2 -D FOREGROU…"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       obraztestowy

Jak widać nasz kontener uruchomił sie i działa poprawnie, oraz ruch z portu 80 ip serwera jest przekierowany na port 80 kontenera.

Aby potwierdzić że wszystko działa poprawnie wpisz w przeglądarce adres http://IP_SERWERA – powinieneś otrzymać taki wynik:

docker-apache2

Oceń wpis