Создание docker контейнера в Unix/Linux
Создание докер-контейнеров не особо сложное занятие, но необходимо понимать что и как выполняется. Я до сегодняшнего момента не использовал докер порядка года или даже полтора. За это время, много изменилось, доработалось и улучшилось.
Создание docker контейнера в Unix/Linux
Создание docker контейнеров можно отнести к нескольким группам:
- Создание docker контейнеров из готовых ( уже созданных кем либо).
- Создание docker контейнера своими средствами.
И я расскажу о том как создавать их или брать готовые решения.
Создание docker контейнеров из готовых ( уже созданных кем либо).
Имеется несколько сайтов где можно взять готовое решение и использовать их — github, dockerhub, как примеры.
Имеется дерево:
captain@Macbook$ ~/My works/VM/magento2: tree . |-- DATA | |-- html | | |-- index.html | | `-- index.php | |-- mariadb | |-- nginx | | `-- conf.d | `-- php-fpm |-- docker-compose.yml |-- docs.txt |-- mariadb | |-- Dockerfile | `-- docker-entrypoint.sh |-- nginx | `-- Dockerfile `-- php-fpm |-- Dockerfile `-- opcache.ini 9 directories, 9 files captain@Macbook $ ~/My works/VM/magento2 :
Начну рассказывать все по- прядку:
Директория DATA — служит для монтирования данных (Файлов и папок которые необходимы). Папка html, служит для моего будущего сайта. У меня там лежат несколько файлов: index.php и index.html. Они нужны для проверки работы сервисов которые я создам. Содержание их может быть любым, но у меня они имеют следующий контекст.
$ vim DATA/html/index.php <?php phpinfo (); ?>
И:
$ vim DATA/html/index.html <H1> HELLO MAN </H1>
В DATA/mariadb и DATA/php-fpm можно положить my.cnf и php-fpm.conf соответственно. В DATA/nginx/conf.d, лежит конфигурационный файл для моего сайта, его можно взять:
$ cat DATA/nginx/conf.d/site.conf server { index index.php index.html; server_name docker_machine.local; error_log /var/log/nginx/error-docker_machine.local.log; access_log /var/log/nginx/access-docker_machine.local.log; root /var/www/html/; # location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; #fastcgi_pass 172.10.0.2:9000; fastcgi_pass lemp_php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
Нужно заменить доменное имя — docker_machine.local на свое.
О docker-compose.yml, я расскажу в следующей моей статье. Но скажу одно — он необходим для запуска контейнеров в виде стека ( как у меня LEMP).
DockerFile с nginx.
Пример с Dockerfile:
$ vim nginx/Dockerfile
Его содержание:
# # Nginx Dockerfile # # https://github.com/dockerfile/nginx # # Pull base image. FROM dockerfile/ubuntu # Install Nginx. RUN \ add-apt-repository -y ppa:nginx/stable && \ apt-get update && \ apt-get install -y nginx && \ rm -rf /var/lib/apt/lists/* && \ echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \ chown -R www-data:www-data /var/lib/nginx # Define mountable directories. VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] # Define working directory. WORKDIR /etc/nginx # Define default command. CMD ["nginx"] # Expose ports. EXPOSE 80 EXPOSE 443
Собираем его:
$ cd nginx && sudo docker build -t nginx:latest .
Для запуска, используйте:
# docker run -d -p 80:80 nginx:latest
Или (Приложить постоянные / общие каталоги):
# docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/conf.d -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx -v <html-dir>:/var/www/html dockerfile/nginx
Готово!
DockerFile с mysql.
Пример с Dockerfile:
$ vim mariadb/Dockerfile
Содержание:
# vim:set ft=dockerfile: FROM debian:jessie # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r mysql && useradd -r -g mysql mysql # add gosu for easy step-down from root ENV GOSU_VERSION 1.7 RUN set -x \ && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true \ && apt-get purge -y --auto-remove ca-certificates wget RUN mkdir /docker-entrypoint-initdb.d # install "pwgen" for randomizing passwords # install "apt-transport-https" for Percona's repo (switched to https-only) RUN apt-get update && apt-get install -y --no-install-recommends \ apt-transport-https ca-certificates \ pwgen \ && rm -rf /var/lib/apt/lists/* ENV GPG_KEYS \ # Key fingerprint = 1993 69E5 404B D5FC 7D2F E43B CBCB 082A 1BB9 43DB # MariaDB Package Signing Key <package-signing-key@mariadb.org> 199369E5404BD5FC7D2FE43BCBCB082A1BB943DB \ # pub 1024D/CD2EFD2A 2009-12-15 # Key fingerprint = 430B DF5C 56E7 C94E 848E E60C 1C4C BDCD CD2E FD2A # uid Percona MySQL Development Team <mysql-dev@percona.com> # sub 2048g/2D607DAF 2009-12-15 430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A \ # pub 4096R/8507EFA5 2016-06-30 # Key fingerprint = 4D1B B29D 63D9 8E42 2B21 13B1 9334 A25F 8507 EFA5 # uid Percona MySQL Development Team (Packaging key) <mysql-dev@percona.com> # sub 4096R/4CAC6D72 2016-06-30 4D1BB29D63D98E422B2113B19334A25F8507EFA5 RUN set -ex; \ export GNUPGHOME="$(mktemp -d)"; \ for key in $GPG_KEYS; do \ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ done; \ gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mariadb.gpg; \ rm -r "$GNUPGHOME"; \ apt-key list RUN echo "deb https://repo.percona.com/apt jessie main" > /etc/apt/sources.list.d/percona.list \ && { \ echo 'Package: *'; \ echo 'Pin: release o=Percona Development Team'; \ echo 'Pin-Priority: 998'; \ } > /etc/apt/preferences.d/percona ENV MARIADB_MAJOR 10.1 ENV MARIADB_VERSION 10.1.21+maria-1~jessie RUN echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/debian jessie main" > /etc/apt/sources.list.d/mariadb.list \ && { \ echo 'Package: *'; \ echo 'Pin: release o=MariaDB'; \ echo 'Pin-Priority: 999'; \ } > /etc/apt/preferences.d/mariadb # add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies # libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql) # also, we set debconf keys to make APT a little quieter RUN { \ echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password password 'unused'; \ echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password_again password 'unused'; \ } | debconf-set-selections \ && apt-get update \ && apt-get install -y \ mariadb-server=$MARIADB_VERSION \ # percona-xtrabackup is installed at the same time so that `mysql-common` is only installed once from just mariadb repos percona-xtrabackup \ socat \ && rm -rf /var/lib/apt/lists/* \ # comment out any "user" entires in the MySQL config ("docker-entrypoint.sh" or "--user" will handle user switching) && sed -ri 's/^user\s/#&/' /etc/mysql/my.cnf /etc/mysql/conf.d/* \ # purge and re-create /var/lib/mysql with appropriate ownership && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \ && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \ # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime && chmod 777 /var/run/mysqld # comment out a few problematic configuration values # don't reverse lookup hostnames, they are usually another container RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \ && echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \ && mv /tmp/my.cnf /etc/mysql/my.cnf VOLUME /var/lib/mysql COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat RUN chmod +x docker-entrypoint.sh ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 CMD ["mysqld"]
И для запуска mariadb нужен еще 1 файл. Открываем( создаем) его:
# vim mariadb/docker-entrypoint.sh
И вставляем в него:
#!/bin/bash set -eo pipefail shopt -s nullglob # if command starts with an option, prepend mysqld if [ "${1:0:1}" = '-' ]; then set -- mysqld "$@" fi # skip setup if they want an option that stops mysqld wantHelp= for arg; do case "$arg" in -'?'|--help|--print-defaults|-V|--version) wantHelp=1 break ;; esac done # usage: file_env VAR [DEFAULT] # ie: file_env 'XYZ_DB_PASSWORD' 'example' # (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of # "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) file_env() { local var="$1" local fileVar="${var}_FILE" local def="${2:-}" if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then echo >&2 "error: both $var and $fileVar are set (but are exclusive)" exit 1 fi local val="$def" if [ "${!var:-}" ]; then val="${!var}" elif [ "${!fileVar:-}" ]; then val="$(< "${!fileVar}")" fi export "$var"="$val" unset "$fileVar" } _check_config() { toRun=( "$@" --verbose --help --log-bin-index="$(mktemp -u)" ) if ! errors="$("${toRun[@]}" 2>&1 >/dev/null)"; then cat >&2 <<-EOM ERROR: mysqld failed while attempting to check config command was: "${toRun[*]}" $errors EOM exit 1 fi } _datadir() { "$@" --verbose --help --log-bin-index="$(mktemp -u)" 2>/dev/null | awk '$1 == "datadir" { print $2; exit }' } # allow the container to be started with `--user` if [ "$1" = 'mysqld' -a -z "$wantHelp" -a "$(id -u)" = '0' ]; then _check_config "$@" DATADIR="$(_datadir "$@")" mkdir -p "$DATADIR" chown -R mysql:mysql "$DATADIR" exec gosu mysql "$BASH_SOURCE" "$@" fi if [ "$1" = 'mysqld' -a -z "$wantHelp" ]; then # still need to check config, container may have started with --user _check_config "$@" # Get config DATADIR="$(_datadir "$@")" if [ ! -d "$DATADIR/mysql" ]; then file_env 'MYSQL_ROOT_PASSWORD' if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then echo >&2 'error: database is uninitialized and password option is not specified ' echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD' exit 1 fi mkdir -p "$DATADIR" echo 'Initializing database' mysql_install_db --datadir="$DATADIR" --rpm echo 'Database initialized' "$@" --skip-networking --socket=/var/run/mysqld/mysqld.sock & pid="$!" mysql=( mysql --protocol=socket -uroot -hlocalhost --socket=/var/run/mysqld/mysqld.sock ) for i in {30..0}; do if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then break fi echo 'MySQL init process in progress...' sleep 1 done if [ "$i" = 0 ]; then echo >&2 'MySQL init process failed.' exit 1 fi if [ -z "$MYSQL_INITDB_SKIP_TZINFO" ]; then # sed is for https://bugs.mysql.com/bug.php?id=20545 mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql fi if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then export MYSQL_ROOT_PASSWORD="$(pwgen -1 32)" echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD" fi "${mysql[@]}" <<-EOSQL -- What's done in this file shouldn't be replicated -- or products like mysql-fabric won't work SET @@SESSION.SQL_LOG_BIN=0; DELETE FROM mysql.user ; CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ; DROP DATABASE IF EXISTS test ; FLUSH PRIVILEGES ; EOSQL if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then mysql+=( -p"${MYSQL_ROOT_PASSWORD}" ) fi file_env 'MYSQL_DATABASE' if [ "$MYSQL_DATABASE" ]; then echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}" mysql+=( "$MYSQL_DATABASE" ) fi file_env 'MYSQL_USER' file_env 'MYSQL_PASSWORD' if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" | "${mysql[@]}" if [ "$MYSQL_DATABASE" ]; then echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" | "${mysql[@]}" fi echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}" fi echo for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;; *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;; *) echo "$0: ignoring $f" ;; esac echo done if ! kill -s TERM "$pid" || ! wait "$pid"; then echo >&2 'MySQL init process failed.' exit 1 fi echo echo 'MySQL init process done. Ready for start up.' echo fi fi exec "$@"
Чтобы создать контейнер, выполните:
$ sudo docker build -t mariadb:latest .
И чтобы запустить его, выполняем:
$ cd mariadb && sudo docker run -d -p 3306:3306 mariadb:latest
DockerFile с php-fpm.
$ vim php-fpm/Dockerfile
Пример с Dockerfile:
FROM php:7-fpm MAINTAINER Mehrdad Dadkhah <mehrdad@dadkhah.me> RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng12-dev \ libpq-dev \ g++ \ libicu-dev \ libxml2-dev \ git \ vim \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng12-dev \ libmagickwand-dev --no-install-recommends \ && docker-php-ext-configure intl \ && docker-php-ext-install mbstring \ && docker-php-ext-install intl \ && docker-php-ext-install zip \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install pdo_pgsql \ && docker-php-ext-install soap \ && docker-php-ext-install -j$(nproc) iconv mcrypt \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install opcache \ && pecl install imagick \ && docker-php-ext-enable imagick \ && pecl install apcu \ && docker-php-ext-enable apcu \ && pecl install xdebug \ && apt-get purge --auto-remove -y g++ \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* ENV PHPREDIS_VERSION php7 RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz \ && mkdir /tmp/redis \ && tar -xf /tmp/redis.tar.gz -C /tmp/redis \ && rm /tmp/redis.tar.gz \ && ( \ cd /tmp/redis/phpredis-$PHPREDIS_VERSION \ && phpize \ && ./configure \ && make -j$(nproc) \ && make install \ ) \ && rm -r /tmp/redis \ && docker-php-ext-enable redis RUN sed -i -e 's/listen.*/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.conf RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN usermod -u 1000 www-data COPY ./opcache.ini /usr/local/etc/php/conf.d/opcache.ini CMD ["php-fpm"]
И создаем:
# vim php-fpm/opcache.ini
И прописываем в него:
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 #opcache.save_comments=0
Создаем сборку и запускаем:
$ sudo docker build -t php:latest .
и
$ cd php-fpm && sudo docker run -d -p 9000:9000 php:latest
Видим что все работает и они запускаются, но вручную….
Создание docker контейнера своими средствами.
Сейчас рассмотрим еще один пример создания какого-то контейнера, например — я хотел бы взять packer.
Папка со всеми моими докерами будет иметь вид:
$ ll total 704 drwxr-xr-x 10 captain staff 320 Dec 6 2017 jenkins+docker+nginx drwxr-xr-x 4 captain staff 128 Oct 24 13:35 packer
Откроем:
$ vim packer/Dockerfile
Мой Dockerfile выглядит следующим образом:
FROM centos:7 MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com" LABEL architecture="amd64" \ OS="CentOS" \ License=GPLv2 \ Description="My test dockerfile" \ Vendor="Natarov Vitaliy" \ Version="0.0.1" ARG PACKER_VERSION=1.3.1 ENV PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:/sbin:/bin:/opt/local/bin:/opt/local/sbin:${PATH}" ENV LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 RUN yum install -y \ epel-release \ yum-plugin-ovl \ wget \ which \ unzip \ rsync \ openssh \ openssh-clients \ python-pip && \ yum clean all RUN wget -q https://releases.hashicorp.com/packer/${PACKER_VERSION}/packer_${PACKER_VERSION}_linux_amd64.zip && \ unzip -q packer_${PACKER_VERSION}_linux_amd64.zip && \ yes|mv -f packer /usr/local/bin/packer && \ chmod +x /usr/local/bin/packer && \ rm -f packer_${PACKER_VERSION}_linux_amd64.zip RUN useradd packer USER packer ENV USER packer WORKDIR /home/packer ENTRYPOINT ["/bin/sh"] CMD ["-c", "/bin/bash"]
Ну что, билдаем сие чудо:
$ docker build -t packer:1.3.1 -f packer/Dockerfile .
Для того чтобы посмотреть созданный(ые) имеджы, выполните:
$ docker images -a
Данная команда покажет все сбилдженные имеджы. Для удаления всех неиспользоваемых образов, можно использовать следующую команду:
$ docker rmi $(docker images | awk '{ print $3; }')
При необходимости, можно посмотреть всю информацию по созданному образу:
$ docker inspect $(docker images | grep -E "packer" | head -n1 | awk {'print $3'})
Запустим контейнер:
$ docker run -d -ti --name=packer packer:1.3.1
Добавим волюму (если нужно):
$ docker run -d -v ${pwd}/packer:/home/packer/ -t -i --name=packer packer:1.3.1
Подключится к контейнеру можно вот так:
$ docker exec -ti packer sh
Или:
$ docker exec -ti packer bash
Так же:
$ docker exec -ti packer packer version
Или 2 последние команды, можно обьеденить в одну и сразу запустить пакер:
$ docker run --rm -it --name=packer9 packer:1.3.1
Смотрим запущенные контейнеры:
$ docker ps
Более красивый вариант:
$ docker ps --format "table {{.Names}}\t{{.Image}}\t{{.ID}}\t{{.RunningFor}}\t{{.Status}}"
Просмотрим подробную информацию о контейнере:
$ docker inspect $(docker ps -a | grep packer| awk {'print $1'})
Ну, могу еще описать процесс создания vault контейнера:
$ vim vault/Dockerfile
Содержание:
FROM centos:7 MAINTAINER Vitaliy Natarov "vitaliy.natarov@yahoo.com" LABEL architecture="amd64" \ OS="CentOS" \ License=GPLv2 \ Description="My dockerfile with vault" \ Vendor="Natarov Vitaliy" \ Version="1.0.0" ARG VAULT_VERSION=0.11.4 ENV PATH="$HOME/bin:/usr/local/bin:/usr/local/sbin:/sbin:/bin:/opt/local/bin:/opt/local/sbin:${PATH}" ENV LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 RUN yum install -y \ epel-release \ yum-plugin-ovl \ wget \ which \ unzip \ rsync \ openssh \ openssh-clients \ python-pip && \ yum clean all RUN wget -q https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \ unzip -q vault_${VAULT_VERSION}_linux_amd64.zip && \ yes|mv -f vault /usr/local/bin/vault && \ chmod +x /usr/local/bin/vault && \ rm -f vault_${VAULT_VERSION}_linux_amd64.zip && \ export VAULT_ADDR='http://127.0.0.1:8200' # ###/usr/local/bin/vault -autocomplete-install # RUN useradd vault USER vault ENV USER vault EXPOSE 8200 WORKDIR /home/vault ENTRYPOINT ["/usr/local/bin/vault"] CMD ["server", "-dev"]
Билдим:
$ docker build -t vault:0.11.4 -f vault/Dockerfile .
Запускаем:
$ docker run -d -ti -p127.0.0.1:8200:8200 --name=vault vault:0.11.4
И напоследок, можно запустить контейнер в следующем моде:
$ docker run -d -ti --restart=always -p127.0.0.1:8200:8200 --name=vault vault:0.11.4
Я описывал несколько других сборок, для ознакомления вы можете их взять их тут:
Установка mysql в контейнере на Docker
Установка nginx в контейнере на Docker
Вот еще полезные статьи о работе с docker:
Остановить/Удалить все Docker контейнеры/images
Хочу отметить следующее, что к каждому контейнеру можно подключиться:
$ sudo docker exec -it 2ab152b77736 /bin/bash
А посмотреть список доступных контейнеров:
$ sudo docker ps
А на этом у меня все! Тема «Создание docker контейнера в Unix/Linux» завершена.