Изучаем по мануалу (1)

/**/

Качаем контейнер

docker pull ubuntu:18.10

Список образов

docker images

docker images | grep ubuntu

REPOSITORY  TAG       IMAGE ID       CREATED         SIZE
ubuntu      18.10     9dc19675e327   2 years ago     67.3MB

Запуск команды внутри контейнера

docker run ubuntu:18.10 echo 'hello from ubuntu'

hello from ubuntu

Список контейнеров

# running only
docker ps | grep ubuntu

# all
docker ps -a | grep ubuntu

Вывод:

CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS  NAMES
7479f2d9eb59   ubuntu:18.10   "echo 'hello from ub…"   About a minute ago   Exited (0) About a minute ago         stupefied_fermat

Заходим в контейнер

docker run -it ubuntu:18.10 /bin/bash

Экспериментируем внутри конейнера:

root@4b94f197232d:/# echo "Hello"
Hello
root@4b94f197232d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@4b94f197232d:/# mkdir /truedir
root@4b94f197232d:/# exit
exit

Снова запускаем контейнер

 docker ps -a | grep ubuntu
4b94f197232d   ubuntu:18.10     "/bin/bash"              3 minutes ago       Exited (0) 58 seconds ago    elastic_jones
7479f2d9eb59   ubuntu:18.10     "echo 'hello from ub…"   6 minutes ago       Exited (0) 6 minutes ago     stupefied_fermat
[root@rhel7-devel1 badcode]# docker start 4b94f197232d
4b94f197232d
[root@rhel7-devel1 badcode]# docker ps | grep ubuntu
4b94f197232d   ubuntu:18.10     "/bin/bash"              4 minutes ago       Up 11 seconds                elastic_jones
[root@rhel7-devel1 badcode]#
[root@rhel7-devel1 badcode]#
[root@rhel7-devel1 badcode]# docker exec -it 4b94f197232d /bin/bash

Видим что ранее созданный каталог “truedir“ сохранился (т.е. изменения в контейнере сохраняются):

root@4b94f197232d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  truedir  usr  var
exit

Создаем Dockerfile

(звезда) все команды для Dockerfile тут: (2)

Создаем файлики:

Файл cli.php:

<?php

// @see https://badcode.ru/docker-tutorial-dlia-novichkov-rassmatrivaiem-docker-tak-iesli-by-on-byl-ighrovoi-pristavkoi/

$n = $i = 5;

while ($i--) {
    echo str_repeat(' ', $i).str_repeat('* ', $n - $i)."n";
}

Файл Dockerfile:

FROM php:7.2-cli
COPY cli.php /cli.php
RUN chmod +x /cli.php
CMD php /cli.php

Билдим через Dockerfile:

docker build . --tag pyramid

Ищем созданный образ:

docker images | grep pyramid
pyramid    latest c2a93886f20b   About a minute ago   398MB

Запускам скрипт из докера

 docker run pyramid
    *
   * *
  * * *
 * * * *
* * * * *

Вносим правки в скрипт и билдим снова

Добавляем параметр в Cli.php:

<?php

// @see https://badcode.ru/docker-tutorial-dlia-novichkov-rassmatrivaiem-docker-tak-iesli-by-on-byl-ighrovoi-pristavkoi/

$n = $i = $argv[1] ?? 5; //а было $n = $i = 5
// это значит, что мы принимаем аргумент из консоли, а если он не получен, то используем по-умолчанию 5

while ($i--) {
    echo str_repeat(' ', $i).str_repeat('* ', $n - $i)."n";
}
docker build . --tag pyramid
docker run pyramid php /cli.php 9
docker run pyramid php /cli.php 9
        *
       * *
      * * *
     * * * *
    * * * * *
   * * * * * *
  * * * * * * *
 * * * * * * * *
* * * * * * * * *

Передаем аргумент в виде параметра контейнера

New Dockerfile:

FROM php:7.2-cli
COPY cli.php /cli.php
RUN chmod +x /cli.php
ENTRYPOINT ["php", "/cli.php"]
## аргумент, который передаётся в командную строку
CMD  ["9"]

Билдим снова:

docker build . --tag pyramid
docker run pyramid 15
              *
             * *
            * * *
           * * * *
          * * * * *
         * * * * * *
        * * * * * * *
       * * * * * * * *
      * * * * * * * * *
     * * * * * * * * * *
    * * * * * * * * * * *
   * * * * * * * * * * * *
  * * * * * * * * * * * * *
 * * * * * * * * * * * * * *
* * * * * * * * * * * * * * *

Монтируем текущую папку

docker run -it -v $(pwd):/mounted  ubuntu:18.10 /bin/bash

ls
#bin  boot  dev  etc  home  lib  lib64  media  mnt  mounted  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

ls mounted
#Dockerfile  cli.php  readme.txt

touch mounted/testfile
# testfile will be available on host machine

Переброска портов

mkdir badcode_apache && cd badcode_apache

<create file: index.php>

<?php
echo 'Hello from apache. We have PHP version = ' . phpversion() . PHP_EOL;

<create file Dockerfile>

FROM php:7.2-apache
# Указываем рабочую папку
WORKDIR /var/www/html
# Копируем все файлы проекта в контейнер
COPY . /var/www/html
EXPOSE 80

docker build . --tag own_php_apache

Запуск контейнера с переброской порта

docker run -p <HOST_PORT>:<CONTAINER_PORT>

docker run -d -p 31000:80 own_php_apache

676d0752775e6cd44b502be92fd8faa2267a0aac9fcd842c220da319bbff16e5

Test in browser: http://rhel7-devel1.rian.off:31000/

Works:

Hello from apache. We have PHP version = 7.2.34

Остановка и удаление контейнеров

docker ps | grep own_php_apache
# 676d0752775e   own_php_apache "docker-php-entrypoi…"   2 minutes ago    Up 2 minutes                    0.0.0.0:31000->80/tcp            lucid_golick

docker stop 676d0752775e
# 676d0752775e

docker rm 676d0752775e
# 676d0752775e

# do the same for 'ubuntu'

Запуск через Docker-compose

(звезда) Здесь же, в папке badcode_apache

Создаем файл docker-compose.yml:

version: '3'

services:
  app:
    build:
      context: .
    ports:
      - 8080:80

Билдим и запускаем

docker-compose up -d

Creating network "badcode_apache_default" with the default driver

Creating badcode_apache_app_1 ... done

Видим, что сервер снова заработал: http://rhel7-devel1.rian.off:31000/

Hello from apache. We have PHP version = 7.2.34

Монтирование через volume

# stop/remove old container
docker-compose stop
Stopping badcode_apache_app_1 ... done

docker-compose rm
Going to remove badcode_apache_app_1
Are you sure? [yN] y
Removing badcode_apache_app_1 ... done

Запуск снова:

 docker-compose up
Creating badcode_apache_app_1 ... done
Attaching to badcode_apache_app_1
app_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.96.2. Set the 'ServerName' directive globally to suppress this message
app_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.96.2. Set the 'ServerName' directive globally to suppress this message
app_1  | [Wed Aug 25 15:11:41.131561 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.2.34 configured -- resuming normal operations
app_1  | [Wed Aug 25 15:11:41.131652 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
<ctrl+C to exit>

Запуск команд внутри контейнера

docker-compose exec app apache2 -v
#Server version: Apache/2.4.38 (Debian)
#Server built:   2020-08-25T20:08:29

Источники:

(1) https://badcode.ru/docker-tutorial-dlia-novichkov-rassmatrivaiem-docker-tak-iesli-by-on-byl-ighrovoi-pristavkoi/

(2) https://docs.docker.com/engine/reference/builder/#from

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.