Поиграемся далее с докером по этому гайду: https://guides.hexlet.io/docker/


Коротко о том, зачем нужен Докер

Docker стал универсальным средством доставки софта независимо от его структуры, зависимостей и способа установки. Всё, что нужно программам, распространяемым через Докер, находится внутри образа и не пересекается с основной системой и другими контейнерами. Важность этого факта невозможно переоценить. Теперь обновление версий программ никак не задействует ни саму систему, ни другие программы. Сломаться больше ничего не может. Всё, что нужно сделать, это скачать новый образ той программы, которую требуется обновить. Другими словами, Докер убрал проблему dependency hell и сделал инфраструктуру immutable (неизменяемой).

Больше всего Docker повлиял именно на серверную инфраструктуру. До эры Докера управление серверами было очень болезненным мероприятием даже несмотря на наличие программ по управлению конфигурацией (chef, puppet, ansible). Основная причина всех проблем — изменяемое состояние. Программы ставятся, обновляются, удаляются. Происходит это в разное время на разных серверах и немного по-разному. Например, обновить версию таких языков, как PHP, Ruby или Python могло стать целым приключением с потерей работоспособности. Проще поставить рядом новый сервер и переключиться на него. Идейно Докер позволяет сделать именно такое переключение. Забыть про старое и поставить новое, ведь каждый запущенный контейнер живет в своем окружении. Причем, откат в такой системе тривиален: всё что нужно — остановить новый контейнер и поднять старый, на базе предыдущего образа.


Ставим докер

Качаем и ставим (под винду): https://docs.docker.com/desktop/windows/install/

(warning) надо будет поставить WSL 2 также (там написано об этом)

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

docker run -d -p 80:80 docker/getting-started

Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
59bf1c3509f3: Pull complete
8d6ba530f648: Pull complete
5288d7ad7a7f: Pull complete
39e51c61c033: Pull complete
ee6f71c6f4a8: Pull complete
f2303c6c8865: Pull complete
0645fddcff40: Pull complete
d05ee95f5d2f: Pull complete
Digest: sha256:aa945bdff163395d3293834697fa91fd4c725f47093ec499f27bc032dc1bdd16
Status: Downloaded newer image for docker/getting-started:latest
c6d3de372b51ff03951a7326f06eb639b625e5e2b002729da954054218581a8e

Смотрим инфу об установленном Докере:

docker info

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.7.1)
  compose: Docker Compose (Docker Inc., v2.2.3)
  scan: Docker Scan (Docker Inc., v0.16.0)

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 20.10.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.16.3-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 12.41GiB
 Name: docker-desktop
 ID: THO3:W3MA:ZV5A:EG2T:3335:WED7:TPI6:H2Z6:SR4G:JKOA:KZM3:4NWI
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

Создание/Запуск контейнера nginx

# goto work dir
cd phpexpCoursesotus_php_prolesson1_docker 

# create/run nginx container
docker run -it nginx bash

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest

root@fb8aff19abcb:/# 

Мы внутри контейнера!

Побродите по файловой системе, посмотрите директорию /etc/nginx. Как видите, её содержимое не совпадает с тем, что находится у вас на компьютере. Эта файловая система появилась из образа nginx. Всё, что вы сделаете здесь внутри, никак не затронет вашу основную файловую систему. Вернуться в родные скрепы можно командой exit.

Почитаем конфиг nginx:

cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Запускаем nginx в контейнере:

docker run -p 8080:80 nginx

или в фоне (в режиме демона):

docker run -d -p 8080:80 nginx

Проверяем: открываем в браузере: http://localhost:8080/

Данная команда не возвращает управление, потому что стартует nginx. Откройте браузер и наберите localhost:8080. Вы увидите как загрузилась страница Welcome to nginx!. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к localhost:8080. Остановить nginx можно командой Ctrl + C.

Другие полезные команды Докера

# watch active/running containers
docker ps
  CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS             PORTS                  NAMES
  e3c3873f03d7   nginx                    "/docker-entrypoint.…"   3 hours ago   Up 26 minutes      0.0.0.0:8080->80/tcp   romantic_payne
  c6d3de372b51   docker/getting-started   "/docker-entrypoint.…"   4 hours ago   Up About an hour   0.0.0.0:80->80/tcp     exciting_dubinsky

# watch container/nginx logs
docker logs -f e3c3873f03d7
  /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
  /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
  ....

# memory consumtion stat
docker stats
  CONTAINER ID   NAME                CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
  e3c3873f03d7   romantic_payne      0.00%     6.812MiB / 12.41GiB   0.05%     10.9kB / 8.31kB   0B / 0B     9
  c6d3de372b51   exciting_dubinsky   0.00%     6.359MiB / 12.41GiB   0.05%     1.71kB / 0B       0B / 0B     9

# stop container: check after it: http://localhost:8080/ 
docker stop e3c3873f03d7
  e3c3873f03d7

# run cmd inside container:
docker run ubuntu ls
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
08c01a0ec47e: Pull complete
Digest: sha256:669e010b58baf5beb2836b253c1fd5768333f0d1dbcb834f7c07a4dc93f474be
Status: Downloaded newer image for ubuntu:latest
bin
boot
dev
etc
home
lib
...

# run with terminal input (-it):
docker run -it ubuntu bash

# watch all containers list
docker ps -a
  CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS                        PORTS                NAMES
  f2fbea9dd04f   ubuntu                   "bash"                   4 hours ago   Exited (255) 26 minutes ago                        compassionate_margulis
  a529652b4c55   ubuntu                   "ls"                     4 hours ago   Exited (0) 4 hours ago                             objective_hellman
  e3c3873f03d7   nginx                    "/docker-entrypoint.…"   4 hours ago   Exited (0) 4 hours ago                             romantic_payne
  e9fecee4812b   nginx                    "/docker-entrypoint.…"   4 hours ago   Exited (0) 4 hours ago                             pensive_noether
  fb8aff19abcb   nginx                    "/docker-entrypoint.…"   5 hours ago   Exited (0) 4 hours ago                             friendly_diffie
  c6d3de372b51   docker/getting-started   "/docker-entrypoint.…"   5 hours ago   Exited (255) 26 minutes ago   0.0.0.0:80->80/tcp   exciting_dubinsky
  
# mount/map external file  
docker run -it -v "E:tmphistory.txt":/root/.bash_history ubuntu bash

Подготовка собственного образа

Создание и публикация собственного образа не сложнее его использования. Весь процесс делится на три шага:

Создается файл Dockerfile в корне проекта. Внутри описывается процесс создания образа.

Выполняется сборка образа командой docker build

Выполняется публикация образа в Registry командой docker push

Рассмотрим процесс создания образа на примере упаковки линтера eslint (не забудьте повторить его самостоятельно). В результате сборки, мы получим образ, который можно использовать так:

Создаем Dockerfile

# Dockerfile
FROM node:9.3

WORKDIR /usr/src

RUN npm install -g eslint babel-eslint
RUN npm install -g eslint-config-airbnb-base eslint-plugin-import

COPY eslintrc.yml /root/.eslintrc.yml

CMD ["eslint", "/app"]

Собираем контейнер

cd phpexpCoursesotus_php_prolesson1_dockerjslint

docker build -t mishaikon/eslint .

[+] Building 171.6s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                      1.0s
 => => transferring dockerfile: 263B                                                                                                                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                         1.2s
 ....
 => => transferring context: 2B                                                                                                                                                                                                                                           0.0s
 => [2/4] WORKDIR /usr/src                                                                                                                                                                                                                                                2.2s
 => [3/4] RUN npm install -g eslint babel-eslint                                                                                                                                                                                                                         29.2s
 => [4/4] RUN npm install -g eslint-config-airbnb-base eslint-plugin-import                                                                                                                                                                                              16.3s
 => exporting to image                                                                                                                                                                                                                                                    3.5s
 => => exporting layers                                                                                                                                                                                                                                                   2.5s
 => => writing image sha256:716bde4fbce7bdb236d343a1067cf315eb1975d7256e17237b6ee2d5b4b00c51                                                                                                                                                                              0.1s
 => => naming to docker.io/mishaikon/eslint                                                                                                                                                                                                                               0.1s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

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

docker run -it -v ${PWD}js:/app mishaikon/eslint

/usr/local/lib/node_modules/eslint/bin/eslint.js:83
        } catch {
                ^
SyntaxError: Unexpected token {
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:152:10)
    at Module._compile (module.js:624:28)
    at Object.Module._extensions..js (module.js:671:10)
....    

Публикация

docker push mishaikon/eslint

Для успешного выполнения публикации нужно соблюсти два условия:

Зарегистрироваться на Docker Cloud и создать там репозиторий для образа.

Залогиниться в cli интерфейсе используя команду docker login.


Шпаргалка по работе с Докером

(звезда) См. полный писок основных команд тут: https://habr.com/ru/company/flant/blog/336654/

(звезда) см. также: Hexlet. Введение в Докер (вебинар на 2 часа) : Введение в Docker [Хекслет] : https://www.youtube.com/watch?v=dfXuTTV6TVo

Tags

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

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

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

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