docker.centos6

Thank you for reading this post, don't forget to subscribe!

Основ­ные спо­со­бы исполь­зо­ва­ния Docker:

  • Авто­ма­ти­за­ция упа­ков­ки и раз­вер­ты­ва­ния приложений
  • Созда­ние соб­ствен­ных лег­ко­вес­ных PaaS окружений
  • Авто­ма­ти­за­ция тести­ро­ва­ния и непре­рыв­ной интеграции/развертывания
  • Раз­вер­ты­ва­ние и мас­шта­би­ро­ва­ние веб-при­ло­же­ний, баз дан­ных и сер­ви­сов бекенда

В то вре­мя как пакет Докер предо­став­ля­ет­ся по умол­ча­нию как часть CentOS-7, это преду­смот­ре­но в хра­ни­ли­ще EPEL для CentOS-6. Пожа­луй­ста, обра­ти­те вни­ма­ние, что это немно­го меня­ет инструк­ции по уста­нов­ке раз­лич­ных вер­сий. Если вам потре­бу­ет­ся послед­няя вер­сия, вы все­гда може­те исполь­зо­вать самую послед­нюю вер­сию и ска­чать его бинар­ный файл, кото­рый рабо­та­ет на ядре 3.8 или выше.

Эти инструк­ции рабо­та­ют для CentOS 6 и более позд­них вер­сий. Они, ско­рее все­го, будут рабо­тать для дру­гих бинар­ных сов­ме­сти­мых дис­три­бу­ти­вов EL6, таких как Scientific Linux, но они не были проверены.

Пожа­луй­ста, обра­ти­те вни­ма­ние, что из-за суще­ству­ю­щих огра­ни­че­ний Docker, он может рабо­тать толь­ко на 64-бит­ной архи­тек­ту­ры.

Что­бы запу­стить Docker вам нуж­но CentOS6 или выше, с ядром вер­сии 2.6.32-431 или выше.

[root@centos64 ~]# uname -a
Linux centos64 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

 

Пожа­луй­ста, обра­ти­те вни­ма­ние, что это для CentOS-6, этот пакет явля­ет­ся частью допол­ни­тель­ных паке­тов для Enterprise Linux (Epel), по это­му нуж­но под­клю­чить EPEL репозиторий.

Пакет docker-io обес­пе­чи­ва­ет уста­нов­ку Docker через Epel.

Так­же реко­мен­до­ва­но обно­вить ядро:
uname -r => 2.6.32-279.el6.x86_64

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-lt
reboot
выби­ра­ем новое ядро
далее nano /etc/grub.conf
меня­ем default=0 ука­зы­вая стро­ку с новым ядром (отсчёт ведёт­ся с нуля)

Если вы уже уста­но­ви­ли (не свя­зан­ный) докер пакет, он будет кон­флик­то­вать с Docker-IO. Что­бы про­дол­жить уста­нов­ку c Docker-IO, пожа­луй­ста, уда­ли­те докер в первую очередь.

Далее, давай­те уста­но­вим docker-io пакет, кото­рый уста­но­вит Docker:

 

yum install docker-io -y

 

Использование Docker

После уста­нов­ки Docker, вы долж­ны буде­те запу­стить докер демон:

service docker start

Если вы хоти­те что­бы Docker запус­кал­ся при загруз­ке вашей ОС, то выполните:

chkconfig docker on

Теперь давай­те убе­дить­ся, что Докер рабо­та­ет. Сна­ча­ла нуж­но полу­чить послед­нюю вер­сию CentOS образа:

docker pull centos

Что­бы ска­чать centos 6  вос­поль­зуй­тесь сле­ду­ю­щей командой:
docker pull centos:centos6

это ска­ча­ет образ ОС, так же мож­но ска­чать гото­вый кон­тей­нер с гото­вой про­грам­мой ( напри­мер nginx, apache mysql и так далее), выполнив:

docker package_name
docker pull nginx

package_name —  имя про­грам­мы (гото­вый кон­тей­нер с программой).

если необ­хо­ди­мо най­ти опре­де­лён­ную сбор­ку вос­поль­зуй­тесь командой:
docker search

Полу­чить спи­сок обра­зов, кото­рые есть на локаль­ной машине:

# docker images

Оста­но­вить все кон­тей­не­ры и потом уда­лить все кон­тей­не­ры:

# docker stop $(docker ps -a -q)# docker rm $(docker ps -a -q)

Уда­лить образ

docker rmi 

Сервис Docker

Управ­ле­ние сер­ви­сом Docker'а:

sudo service docker start|stop|restart|statussudo restart docker # алиас

Основные команды по работе с контейнерами

docker create

создать кон­тей­нер, но не запус­кать его

docker run

создать и запу­стить контейнер

docker stop

оста­но­вить контейнер

docker start

запу­стить суще­ству­ю­щий оста­нов­лен­ный контейнер

docker restart

пере­за­пу­стить контейнер

docker rm

уда­лить контейнер

docker kill

отпра­вить сиг­нал SIGKILL контейнеру

docker attach

под­клю­чить­ся к рабо­та­ю­ще­му контейнеру

docker wait

бло­ки­ро­вать коман­ду и ждать, пока кон­тей­нер не остановится

Информация о контейнерах

docker ps

пока­зать рабо­та­ю­щие кон­тей­не­ры (или вооб­ще кон­тей­не­ры, если исполь­зо­вать допол­ни­тель­ные опции)

docker ps -a

пока­зать ВСЕ контейнеры

docker inspect

пока­зать всю инфор­ма­цию о кон­тей­не­ре, вклю­чая IP-адреса

docker logs

пока­зать лог-вывод контейнера

В режи­ме tail -f:

docker logs -f

docker events

пока­зать собы­тия контейнера

docker port

пока­зать откры­тые нару­жу пор­ты контейнера

docker top

пока­зать про­цес­сы, рабо­та­ю­щие внут­ри контейнера

docker stats

пока­зать ста­ти­сти­ку исполь­зо­ва­ния ресур­сов контейнером

docker diff

пока­зать изме­нён­ные фай­лы в фай­ло­вой систе­ме контейнера

Про­смот­реть кон­фи­гу­ра­цию кон­тей­не­ра в JSON-фор­ма­те: docker inspect container_name
Про­смот­реть отдель­ную часть конфигурации/переменную: docker inspect -f '{{ .NetworkSettings.IPAddress }}' container_name

 

Все изме­не­ния в суще­ству­ю­щем вашем кон­тей­не­ре вы може­те заком­ми­тить в образ что­бы в буду­щем мож­но было вос­поль­зо­вать­ся им:

docker commit <id_контейнера> <имя_образа>

 

ВЫХОД ИЗ КОНТЕЙНЕРА БЕЗ ЕГО ОСТАНОВКИ:
CTRL+P+Q

 

Пере­нос обра­за на дру­гой хост


Напри­мер, вы уже все настро­и­ли (все ваши при­ло­же­ние в Docker и так же заком­ми­ти­ли в образ), то после это­го все­го мож­но уже сме­ло сохра­нить образ в файл для пере­но­са на дру­гой хост:

 

docker save имя_образа > ~/my_container_for_nransfer.tar

 

После чего необ­хо­ди­мо ско­пи­ро­вать дан­ный архив (образ) на дру­гой хост ( пред­по­ло­жим через scp) и нуж­но после чего импор­ти­ро­вать его в Docker.

 

docker load < /tmp/my_container_for_nransfer.tar

 

 

Создание контейнер-демона

Конеч­но, мож­но созда­вать и дол­го живу­щие кон­тей­не­ры, под­хо­дя­щие для запус­ков при­ло­же­ний и сер­ви­сов. Такие кон­тей­не­ры не име­ют интер­ак­тив­ной сессии:

docker run --name container_name -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"

 

container_name – имя контейнера.

Мож­но посмот­реть, что про­ис­хо­дит внут­ри ваше­го кон­тей­не­ра используя:

docker logs <container_name>

 

Если необ­хо­ди­мо оста­но­вить ваш кон­тей­нер, то воспользуйтесь:

$ docker stop <container_name>

 

Что­бы запу­стить ваш кон­тей­нер выполните:

docker start <container_name>

 

выпол­не­ние цик­ла while про­дол­жит­ся в контейнере.

Что­бы посмот­реть дета­ли ваше­го кон­тей­не­ра используйте:

docker inspect <container_name>

 

Для уда­ле­ния ваше­го кон­тей­нер, используйте:

docker rm <container_name>

 

Созда­ем (про­пи­сы­ва­ем) имя хоста в сво­ем кон­тей­нерe:

docker run -t -i --hostname=ubuntu-box debian /bin/bash

 

Так же мож­но доба­вить пара­метр кото­рый доба­вит кор­рект­ное имя ваше­го кон­тей­не­ра (я рас­ска­зы­вал это вверху).

 

Положить/достать данные в контейнер


Если Вы хоти­те ско­пи­ро­вать дан­ные в кон­тей­нер или извлечь из него что то:

docker cp <путь_к_данным_на_хосте> <container_name>:<путь>

 

Напри­мер нуж­но ска­чать с кон­тей­не­ра неко­то­рый файл и поло­жить его в домаш­нюю директорию:

docker cp bcfa1008952e:/etc/nginx/nginx.conf /home/captain/

bcfa1008952e -это ИД само­го контейнера

Мож­но под­мон­ти­ро­вать пап­ку хоста в кон­тей­нер при создании:

docker run -v /tmp:/root -t -i <имя_образа>

/tmp – это путь к пап­ке на вашем хосте.

/root – путь к пап­ке на вашем сервере.

Так вы лег­ко може­те рабо­тать с дан­ны­ми из кон­тей­не­ра с дан­ны­ми на хосте и исклю­чить необ­хо­ди­мость копи­ро­ва­ния дан­ных в обе стороны.

 

Как пробросить порт в созданном контейнере Docker?

iptables -t nat -A DOCKER -p tcp --dport 8002 -j DNAT --to-destination 192.168.103.193:80

 

Заме­ча­ние: Нуж­но стар­та­нуть тот кон­тей­нер на кото­ром нуж­но про­бро­сить порт и запус­ка­ем коман­ду что выше. Она откро­ет порт «80» на  192.168.103.193 ИП.

ПРИМЕР.

Я постав­лю уже гото­вый кон­тей­нер толь­ко с одной про­грам­мой — nginx:

docker run --name some-nginx -p 192.168.103.189:8080:80 -v /some/content:/var/nginx/docker.localhost.localdomain:ro -d nginx

 

192.168.103.189 — IP адрес вир­ту­аль­ной машины.

8080 — это порт на кото­ром будет рабо­тать nginx.
80 — это порт на кото­ром рабо­та­ет докер.

Если не ука­зать IP адрес, то он будет слу­шать все ИП адреса.

 

Установка Docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

 

Docker Compose упро­ща­ет жизнь если у вас боль­ше одно­го кон­тей­не­ра. С помо­щью одно­го, а ино­гда несколь­ких фай­лов, мы опи­сы­ва­ем какие кон­тей­не­ры запус­кать, их настрой­ки и свя­зи меж­ду кон­тей­не­ра­ми. Начи­ная со вто­рой вер­сии docker compose под­дер­жи­ва­ет насле­до­ва­ние и мож­но с его помо­щью опи­сы­вать раз­ные кон­фи­гу­ра­ции для раз­ных окру­же­ний. коман­ды не толь­ко похо­жи на коман­ды от docker, они и предо­став­ля­ют ана­ло­гич­ный функционал.
Един­ствен­ная раз­ни­ца состо­ит в том, что при­ме­ня­ют­ся они не к отдель­но­му кон­тей­не­ру, а ко всей груп­пе, опре­де­лен­ной в кон­фи­гу­ра­ци­он­ном фай­ле docker-compose.yml

  • Коман­ды для рабо­ты с обра­за­ми: save, search, images, import, export, tag, history…
  • Коман­ды для вза­и­мо­дей­ствия с поль­зо­ва­те­лем: attach, exec, run -i, login, wait

Отдель­но сто­ит запом­нить коман­ду docker-compose up. Она пред­став­ля­ет собой упро­щен­ный вызов docker-compose build && docker-compose run

Команды Docker Compose

Рас­смот­рим коман­ды, кото­рые под­дер­жи­ва­ет Docker Compose.

Коман­да docker-compose рабо­та­ет на уровне ката­ло­га. На одной машине мож­но иметь несколь­ко групп кон­тей­не­ров; для это­го нуж­но создать отдель­ный ката­лог и отдель­ный файл docker-compose.yml для каж­до­го контейнера.

Вы уже запус­ка­ли коман­ду docker-compose up и оста­но­ви­ли про­цесс при помо­щи ком­би­на­ции CTRL-C. Это выво­дит в окно тер­ми­на­ла отла­доч­ные сооб­ще­ния. Одна­ко в сре­де про­из­вод­ства инстру­мент docker-compose дол­жен рабо­тать как сер­вис. Для это­го доста­точ­но доба­вить опцию –d:

docker-compose up -d

Эта коман­да запус­ка­ет docker-compose в фоно­вом режиме.

Что­бы про­смот­реть груп­пу кон­тей­не­ров Docker (и запу­щен­ных, и отклю­чен­ных), исполь­зуй­те сле­ду­ю­щую команду:

docker-compose ps

К при­ме­ру, вывод может иметь такой вид (этот вывод сооб­ща­ет, что кон­тей­нер helloworld_my-test_1 отключен):

Name           Command   State    Ports
-----------------------------------------------
helloworld_my-test_1   /hello    Exit 0

Состо­я­ние запу­щен­ных кон­тей­не­ров – Up:

Name              Command          State        Ports
---------------------------------------------------------------
nginx_nginx_1   nginx -g daemon off;   Up      443/tcp, 80/tcp

Что­бы оста­но­вить все кон­тей­не­ры Docker в груп­пе кон­крет­но­го при­ло­же­ния, выпол­ни­те сле­ду­ю­щую коман­ду в ката­ло­ге, в кото­ром нахо­дит­ся файл docker-compose.yml, при помо­щи кото­ро­го был запу­ще­на груп­па Docker:

docker-compose stop

При­ме­ча­ние: Так­же мож­но исполь­зо­вать коман­ду docker-compose kill.

Ино­гда Docker хра­нит инфор­ма­цию во внут­рен­нем томе. Что­бы вер­нуть сре­ду в её исход­ное состо­я­ние, нуж­но исполь­зо­вать коман­ду rm, кото­рая уда­ля­ет все кон­тей­не­ры, создан­ные группой:

docker-compose rm

Если запу­стить эту коман­ду в дру­гом ката­ло­ге (не в том, в кото­ром хра­нит­ся кон­тей­нер Docker и yml-файл), коман­да вер­нёт ошибку:

Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml

Ниже при­ве­дён при­мер подоб­но­го файла.

# Вер­сия docker-compose

version: '2'

# Спи­сок наших сер­ви­сов (кон­тей­не­ров)

services:

nginx:

# исполь­зу­ем послед­ний ста­биль­ный образ nginx

image: nginx:latest

# марш­ру­ти­зи­ру­ем порты

ports:

- "8000:80"

# мон­ти­ру­ем дирек­то­рии, сле­ва дирек­то­рии на основ­ной машине, спра­ва - куда они мон­ти­ру­ют­ся в контейнере

volumes:

- ./hosts:/etc/nginx/conf.d

- ./www:/var/www

- ./logs:/var/log/nginx

# nginx дол­жен общать­ся с php контейнером

links:

- php

php:

# у нас свой образ для PHP, ука­зы­ва­ем путь к нему и гово­рим что его надо собрать

build: ./images/php

# этот образ будет общать­ся с mysql

links:

- mysql

# мон­ти­ру­ем дирек­то­рию с проектами

volumes:

- ./www:/var/www

mysql:

image: mariadb

ports:

- "3306:3306"

volumes:

- ./mysql:/var/lib/mysql

# зада­ем пароль для root пользователя

environment:

MYSQL_ROOT_PASSWORD: secret

pma:

# исполь­зу­ем послед­ний ста­биль­ный образ phpmyadmin

image: phpmyadmin/phpmyadmin

restart: always

links:

- mysql:mysql

ports:

- 8183:80

environment:

# про­пи­сы­ва­ем назва­ние наше­го MySQL хоста

PMA_HOST: mysql

MYSQL_USERNAME: root

MYSQL_ROOT_PASSWORD: secret

 

Создадим/запустим кон­тей­нер с Centos 6 (если образ пред­ва­ри­тель­но не был ска­чан, то Docker сам авто­ма­ти­че­ски его ска­ча­ет с Docker public registry)

docker run -dit --name apache_php53 --hostname="apache_php53" -p 8053:8053 centos6 /bin/bash

docker run [опции] образ [коман­да]

--name Имя кон­тей­не­ра вме­сто ID

-w Ука­зать рабо­чую дирек­то­рию (--workdir)

-e Уста­но­вить пере­мен­ную окру­же­ния в контейнере

-u Пользователь:группа под кото­рым дол­жен быть запу­щен контейнер

-v Смон­ти­ро­вать в кон­тей­нер файл или ката­лог хост-системы
-d – запус­кать кон­тей­нер в фоно­вом режиме
-p Про­бро­сить порт(ы) кон­тей­не­ра - <порт хост-системы>:<порт кон­тей­не­ра> (--publish=[])
--entrypoint Заме­нить дефолт­ную коман­ду из ENTRYPOINT фай­ла Dockerfile
-t - запус­кать кон­тей­нер в интер­ак­тив­ном режиме
-i - выде­лить tty-тер­ми­нал, кото­рый тре­бу­ет­ся для при­со­еди­не­ния к контейнеру
--hostname – уста­но­вить имя хоста внут­ри контейнера

 

Создание/построение образа из Dockerfile

Созда­дим образ с Ubuntu 16.04, кото­рый впо­след­ствии может быть исполь­зо­ван для созда­ния кон­тей­не­ра. Для это­го созда­дим Dockerfile, в кото­ром про­пи­шем необ­хо­ди­мые инструкции

# mkdir -p /root/ubuntu16.04 && cd /root/ubuntu16.04

# nano Dockerfile

# This is a comment
FROM ubuntu:16.04
MAINTAINER Eugene Kamenev <username@mydomain.com>
RUN apt-get update && apt-get install -y apache2

Фор­мат Dockerfile име­ет вид

INSTRUCTION statement
Ком­мен­та­ри­ям пред­ше­ству­ет символ #
Назва­ние инструк­ции пишут­ся с боль­шой буквы
В Dockerfile были исполь­зо­ва­ны сле­ду­ю­щие инструкции
FROM - опре­де­ля­ет какой источ­ник исполь­зо­вать для наше­го обра­за – уста­нав­ли­ва­ем Ubuntu 16.04
MAINTAINER – имя и E-mail лица, обслу­жи­ва­ю­ще­го этот образ
RUN - коман­ды, кото­рые необ­хо­ди­мо выпол­нить внут­ри обра­за – обнов­ля­е­мый локаль­ный кеш паке­тов и уста­нав­ли­ва­ем Apache

CMD  ука­зы­ва­ет, какую коман­ду необ­хо­ди­мо запу­стить, когда кон­тей­нер запу­щен. В отли­чие от коман­ды RUN ука­зан­ная коман­да испол­ня­ет­ся не во вре­мя постро­е­ния обра­за, а во вре­мя запус­ка контейнера.

CMD ["/bin/bash", "-l"]

Важ­но пом­нить, что вы може­те пере­гру­зить коман­ду CMD, исполь­зуя docker run.

ENTRYPOINT

Часто коман­ду CMD пута­ют с ENTRYPOINT. Раз­ни­ца в том, что вы не може­те пере­гру­жать ENTRYPOINT при запус­ке контейнера.

ENTRYPOINT ["/usr/sbin/nginx"]

При запус­ке кон­тей­не­ра пара­мет­ры пере­да­ют­ся коман­де, ука­зан­ной в ENTRYPOINT.

docker run -d trukhinyuri/static_web -g "daemon off"

Мож­но ком­би­ни­ро­вать ENTRYPOINT и CMD.

ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]

В этом слу­чае коман­да в ENTRYPOINT выпол­нит­ся в любом слу­чае, а коман­да в CMD выпол­нит­ся, если не пере­да­но дру­гой коман­ды при запус­ке кон­тей­не­ра. Если тре­бу­ет­ся, вы все-таки може­те пере­гру­зить коман­ду ENTRYPOINT с помо­щью фла­га --entrypoint.

WORKDIR

С помо­щью WORKDIR мож­но уста­но­вить рабо­чую дирек­то­рию, отку­да будут запус­кать­ся коман­ды ENTRYPOINT и CMD.

WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]

Вы може­те пере­гру­зить рабо­чую дирек­то­рию кон­тей­не­ра в ран­тай­ме с помо­щью фла­га -w.

USER

Спе­ци­фи­ци­ру­ет поль­зо­ва­те­ля, под кото­рым дол­жен быть запу­щен образ. Мы можем ука­зать имя поль­зо­ва­те­ля или UID и груп­пу или GID.

USER user

USER user:group

USER uid

USER uid:gid

USER user:gid

USER uid:group

Вы може­те пере­гру­зить эту коман­ду, исполь­зуя глаг -u при запус­ке кон­тей­не­ра. Если поль­зо­ва­тель не ука­зан, исполь­зу­ет­ся root по-умолчанию.

VOLUME

Инструк­ция VOLUME добав­ля­ет тома в образ. Том — пап­ка в одном или более кон­тей­не­рах или пап­ка хоста, про­бро­шен­ная через Union File System (UFS).
Тома могут быть рас­ша­ре­ны или повтор­но исполь­зо­ва­ны меж­ду кон­тей­не­ра­ми. Это поз­во­ля­ет добав­лять и изме­нять дан­ные без ком­ми­та в образ.

VOLUME ["/opt/project"]

В при­ме­ре выше созда­ет­ся точ­ка мон­ти­ро­ва­ния /opt/project для любо­го кон­тей­не­ра, создан­но­го из обра­за. Таким обра­зом вы може­те ука­зы­вать и несколь­ко томов в массиве.

ADD

Инструк­ция ADD добав­ля­ет фай­лы или пап­ки из наше­го билд-окру­же­ния в образ, что полез­но напри­мер при уста­нов­ке приложения.

ADD software.lic /opt/application/software.lic

Источ­ни­ком может быть URL, имя фай­ла или директория.

ADD http://wordpress.org/latest.zip /root/wordpress.zip

ADD latest.tar.gz /var/www/wordpress/

В послед­нем при­ме­ре архив tar.gz будет рас­па­ко­ван в /var/www/wordpress. Если путь назна­че­ния не ука­зан — будет исполь­зо­ван пол­ный путь вклю­чая директории.

COPY

Инструк­ция COPY отли­ча­ет­ся от ADD тем, что пред­на­зна­че­на для копи­ро­ва­ния локаль­ных фай­лов из билд-кон­тек­ста и не под­дер­жи­ва­ет рас­па­ков­ки файлов:

COPY conf.d/ /etc/apache2/

 

ONBUILD

Инструк­ция ONBUILD добав­ля­ет триг­ге­ры в обра­зы. Триг­гер испол­ня­ет­ся, когда образ исполь­зу­ет­ся как базо­вый для дру­го­го обра­за, напри­мер, когда исход­ный код, нуж­ный для обра­за еще не досту­пен, но тре­бу­ет для рабо­ты кон­крет­но­го окружения.

ONBUILD ADD . /app/srcONBUILD RUN cd /app/src && make

______________________________________________________

 

                                            ПРИМЕРЫ

Ста­вим apache и php вер­сию 5,3

кача­ем образ базовый:
[root@centos64 ~]# docker search centos6

[root@centos64 ~]# docker pull centos:6

про­ве­ря­ем:
[root@centos6 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos 6 c5c4288a6477 8 weeks ago 193.9 MB

созда­дим контейнер:
docker run -d --restart=always --name apache_php53 --hostname=apache_php53 -p 8053:8053 -v /etc/httpd/conf.d/docker53:/etc/httpd/conf.d/ -v /var/www/:/var/www/ centos:6

5685827b5a0759e2f25e3e6df85b443d49f361becd0516dd13ce79bf7a5e285a

-d – запус­кать кон­тей­нер в фоно­вом режиме

-t - запус­кать кон­тей­нер в интер­ак­тив­ном режиме
-i - выде­лить tty-тер­ми­нал, кото­рый тре­бу­ет­ся для при­со­еди­не­ния к контейнеру

--restart=always - автозапуск

--name apache_php53 - Имя кон­тей­не­ра вме­сто ID

--hostname – уста­но­вить имя хоста внут­ри контейнера

-p Про­бро­сить порт(ы) кон­тей­не­ра - <порт хост-системы>:<порт контейнера>

-v Смон­ти­ро­вать в кон­тей­нер файл или ката­лог хост-системы

 

допол­ни­тель­но:
(

-w Ука­зать рабо­чую дирек­то­рию (--workdir)

-e Уста­но­вить пере­мен­ную окру­же­ния в контейнере

-u Пользователь:группа под кото­рым дол­жен быть запу­щен контейнер

)

про­ве­рим:

[root@centos64 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5685827b5a07 centos:6 "/bin/bash" 25 seconds ago Up 24 seconds tcp, 0.0.0.0:8053->8053/tcp apache_php53

под­клю­чим­ся и про­из­ве­дём установку:
docker attach apache_php53

yum -y install httpd mod_ssl

chkconfig httpd on

sed -i 's|Listen 80|Listen 8053|' /etc/httpd/conf/httpd.conf

sed -i 's|#ServerName www.example.com:80|ServerName www.example.com:8053|' /etc/httpd/conf/httpd.conf

yum install php php-common php-gd php-mysql php-xml php-mbstring -y

[root@apache_php53 ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

 

Ста­вим apache и php вер­сию 5,4

docker run -dti --restart=always --name apache_php54 --hostname=apache_php54 -p 8054:8054 -v /etc/httpd/conf.d/docker54:/etc/httpd/conf.d/ -v /var/www/:/var/www/ centos:6
29d8fa0214c99f50c476ac5b442c77384d0df56e19bd6a349a95c34f10033972

 

docker attach apache_php54

yum install wget httpd mod_ssl -y

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpmwget http://rpms.famillecollet.com/enterprise/remi-release-6.rpmrpm -Uvh epel-release-6-8.noarch.rpm remi-release-6.rpm yum install yum-utilsyum-config-manager --enable remi-php54yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo

sed -i 's|Listen 80|Listen 8054|' /etc/httpd/conf/httpd.conf

sed -i 's|#ServerName www.example.com:80|ServerName www.example.com:8054|' /etc/httpd/conf/httpd.conf

[root@apache_php54 ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

 

доба­вим стан­дарт­ный виртуалхост:
[root@centos64 ~]# cat /etc/httpd/conf.d/docker53/tt.ru.conf
<VirtualHost *:8053>
ServerAdmin webmaster@tt.ru
DocumentRoot /var/www/user1/site/tt.ru
ServerName tt.ru
ServerAlias www.tt.ru
ErrorLog /var/www/user1/logs/tt.ru.error.log
CustomLog /var/www/user1/logs/tt.ru.access.log common
</VirtualHost>

[root@centos64 ~]# cat /etc/httpd/conf.d/docker54/tt.ru.conf
<VirtualHost *:8054>
ServerAdmin webmaster@tt.ru
DocumentRoot /var/www/user1/site/tt.ru
ServerName tt.ru
ServerAlias www.tt.ru
ErrorLog /var/www/user1/logs/tt.ru.error.log
CustomLog /var/www/user1/logs/tt.ru.access.log common
</VirtualHost>

 

пра­вим кон­фиг файл nginx

[root@centos64 ~]# cat /etc/nginx/conf.d/tt.ru.conf

server {
listen 80;
server_name tt.ru www.tt.ru;
access_log /var/www/user1/logs/tt.ru.nginx.access.log combined;
error_log /var/www/user1/logs/tt.ru.nginx.error.log error;
client_max_body_size 5m;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 4;
gzip_min_length 1024;
gzip_types text/css text/plain text/json text/x-js text/javascript text/xml application/json application/x-javascript application/xml application/xml+rss application/javascript;
gzip_vary on;
gzip_http_version 1.0;
gzip_disable msie6;
location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|swf|js|html|htm|)$ {
root /var/www/user1/site/tt.ru;
}
location / {
proxy_pass http://127.0.0.1:8054;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
}
}

если пона­до­бит­ся вер­сия 5.3 нуж­но скор­рек­ти­ро­вать строку:
proxy_pass http://127.0.0.1:8054;       на          proxy_pass http://127.0.0.1:8053;

 

Сохра­ня­ем обра­зы:

[root@centos64 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29d8fa0214c9 centos:6 "/bin/bash" 30 minutes ago Up 30 minutes 0.0.0.0:8054->8054/tcp apache_php54
4b27322086ce centos:6 "/bin/bash" 39 minutes ago Up 39 minutes 0.0.0.0:8053->8053/tcp apache_php53

[root@centos64 ~]# docker commit -m "apache_php53" -a "polzovatel root" 4b27322086ce apache_php53
99fe1159d2770df097f7131484bcb265a0478b3b9a971146f55b8e8e081226ce

[root@centos64 ~]# docker commit -m "apache_php54" -a "polzovatel root" 29d8fa0214c9 apache_php54
f09737b4700a597597c40f143e88ac9304ea2236e06ba3795e1dd332cd4e2775

[root@centos64 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
apache_php54 latest f09737b4700a 7 seconds ago 684.2 MB
apache_php53 latest 99fe1159d277 53 seconds ago 619.3 MB
centos 6 fe05c7caac05 21 months ago 497.2 MB

-m – сообщение,которое будет инфор­ми­ро­вать дру­гих поль­зо­ва­те­лей о том, какие изме­не­ния были сделаны(аналогично опции -m
при исполь­зо­ва­нии систе­му управ­ле­ния версиями)
-a - автор коммита
4b27322086ce – ID-контейнера
apache_php53 – имя ново­го Docker-образа

 

Теперь эти обра­зы мож­но исполь­зо­вать при запуске/создании контейнера:

docker run -dti --restart=always --name apache_php54 --hostname=apache_php54 -p 8054:8054 -v /etc/httpd/conf.d/docker54:/etc/httpd/conf.d/ -v /var/www/:/var/www/ apache_php54 /bin/bash

 

Собе­рём теже 2 обра­за, но через dockerfile

1ый образ:
cat Dockerfile
FROM centos:6
MAINTAINER mid
RUN yum -y install httpd mod_ssl \
&& yum -y install php php-common php-gd php-mysql php-xml php-mbstring
EXPOSE 8053
ENV HOSTNAME apache_php53
ENV NAME apache_php53
VOLUME ["/etc/httpd/conf.d/", "/var/www/"]

ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

 

собе­рём командой:
docker build -t apache_php53 .
apache_php53 - назва­ние образа

 

собе­рём вто­рой образ, для это­го созда­дим отдель­ную дирек­то­рию и поме­стим туда dockerfile

cat 2/dockerfile
FROM centos:6
MAINTAINER mid
RUN yum -y install wget \
&& wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm \
&& wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm \
&& rpm -Uvh epel-release-6-8.noarch.rpm remi-release-6.rpm \
&& yum -y install yum-utils \
&& yum-config-manager --enable remi-php54 \
&& yum -y install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo \
&& sed -i 's|Listen 80|Listen 8054|' /etc/httpd/conf/httpd.conf \
&& sed -i 's|#ServerName www.example.com:80|ServerName www.example.com:8054|' /etc/httpd/conf/httpd.conf

EXPOSE 8054
ENV HOSTNAME apache_php54
ENV NAME apache_php54
VOLUME ["/etc/httpd/conf.d/", "/var/www/"]

ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

собе­рём командой:
docker build -t apache_php54 2/

2/ это дирек­то­рия в кото­рой нахо­дит­ся вто­рой dockerfile

apache_php54 - назва­ние образа

 

про­ве­рим

docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
apache_php54 latest d1babfafff06 6 seconds ago 643.6 MB
apache_php53 latest 2be5d3645433 7 minutes ago 578.9 MB
centos 6 fe05c7caac05 21 months ago 497.2 MB

 

 

ОШИБКИ
Если при запус­ке docker-compose полу­ча­ем ошиб­ку вида:
ERROR: The Docker Engine version is less than the minimum required by Compose. Your current project requires a Docker Engine of version 1.10.0 or greater.
то пони­жа­ем вер­сию composer: