Шпаргалка по Docker


Шпаргалка по Docker           Введение в Docker Compose 

 

 

echo '{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }'  >> /etc/docker/daemon.json
mkdir  ~/.config/docker/
echo '{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }'  >> ~/.config/docker/daemon.json
systemctl reload docker

1. install docker

# если на С:\ не хватает места
mklink /D "c:\Program Files\Docker" "e:\Program Files\Docker"
C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx

 https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/

sudo apt update
#
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce
sudo systemctl status docker
#
sudo usermod -aG docker ${USER}
#
VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')
DESTINATION=/usr/local/bin/docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION
sudo chmod 755 $DESTINATION

Запуск docker от пользователя:

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
or
sudo service docker.io restart
newgrp docker
# если прав нет хватает 
chown -R $(whoami) /usr/local/bin

 

Как посмотреть использование памяти и CPU всех Docker контейнеров

docker ps -q | xargs  docker stats --no-stream

 

docker ps -aq # List all containers (only IDs)
docker stop $(docker ps -a -q) # Stop all running containers
docker rm $(docker ps -a -q) # Remove all containers

docker rmi $(docker images -q) # Remove all images
docker system prune -a

#
docker ps -q | xargs docker inspect --format '{{ .Id }} - {{ .Name }} - {{ .NetworkSettings.IPAddress }}'

cat << EOT >> ~/.bashrc
# docker
alias d="docker"
alias ds="docker ps --format '{{.Status}}\t{{.Names}}\t{{.Ports}}'"
alias dstop="docker ps -q | xargs -I {} docker stop {}"
# docker-compose
alias dc="docker-compose"
alias dcup="docker-compose up -d"
alias dcstop="docker-compose stop"
EOT

 

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

 офицальная . как сделать ssh  

 Docker образ доступен только для чтения. Когда docker запускает контейнер, он создает уровень для чтения/записи сверху образа (используя union file system, как было указано раньше), в котором может быть запущено приложение.

Как это было

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

Такой подход имеет явные недостатки: софт, который нужен для сборки, не всегда нужен для работы, например, для сборки программы на C++ или Go понадобится компилятор, но полученный бинарник можно запускать уже без компилятора. При этом софт, необходимый для сборки, может весить намного больше, чем полученный артефакт.
Второй недостаток вытекает из первого: больше софта в итоговом образе — больше уязвимостей, а значит, мы теряем в безопасности наших сервисов.

Сегодня устоявшейся практикой является отделение образа для сборки от образа для запуска.

# Стадия сборки "build-env"
FROM golang:1.8.1-alpine AS build-env
# Устанавливаем зависимости, необходимые для сборки
RUN apk add --no-cache \
    git \
    make
ADD . /go/src/github.com/username/project
WORKDIR /go/src/github.com/username/project
# Запускаем сборку
RUN make build
# --------
# Стадия подготовки image к бою
FROM alpine:3.5
# Копируем артефакт сборки из стадии "build-env" в указанный файл
COPY --from=build-env /go/src/github.com/username/project/bin/service /usr/local/bin/service
EXPOSE 65122
CMD ["service"]

Результаты сборки:

330MB на стадии билда, 16.5MB после билда и готовое к запуску. Всё в одном Dockerfile с минимальной конфигурацией.

В системе build-стадия сохраняется на диск как <none>:<none>

 https://gitlab.rebrainme.com/webinars/gocalccicd/blob/master/.gitlab-ci.yml

 

 


 2. config and build 

cat <<EOT >> Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server vim.tiny tar 
RUN mkdir /var/run/sshd
RUN echo 'root:1' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22 80
CMD ["/usr/sbin/sshd", "-D"]

EOT

 Делаем образ

docker build -t ssh . 

Запускаем его и входим по ssh

docker images
docker run -d -p 122:22 -p8080:80 -v /home/win/:/winhome ssh
docker ps
ssh root@localhost -p122

 

если видим 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
то делаем 
cd ~
rm .ssh/known_hosts

 ставим пых

apt-get install -y mc git apache2
apt-get install -y php libapache2-mod-php php-mcrypt php-mysql php7.0-pgsql php7.0-bcmath php7.0-curl php7.0-zip php7.0-xml php7.0-mbstring
# swoole
apt-get install -y php-pear php-dev libcurl3-openssl-dev
pecl install pecl_http swoole-2.1.1

  

 


 DOCKER: РЕЗЕРВНОЕ КОПИРОВАНИЕ И ВОССТАНОВЛЕНИЕ

 

# save
docker images
docker save -o busybox_latest.tar busybox:latest
# удалить 
docker rmi 7968321274dc
# восстановить 
docker load -i busybox_latest.tar
# можем делать контейнер по ID образа
docker images
docker run -d -p 122:22 -p8080:80  ID
docker ps
#
# сохраняем образы docker-compose   
docker save -o docker-images.tar $(docker-compose config | awk '{if ($1 == "image:") print $2;}' ORS=" ")
docker load -i docker-images.tar

  

docker images
docker ps
# чтобы создать образ из контейнера надо его закоммитить 
docker commit -p 78727078a04b container1:0.0.1
docker images

 


 ssh Docker

docker images
docker run -d -p 122:22 -p 8080:80 example1
docker ps
docker exec -it 6s6df4649s bash

 

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

чтобы  войти под рутом  надо в контейнере сменить пароль для рута 
passwd 

sed -i 's/Port 22/Port 2222/g' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config


Now you can even run graphical applications (if they are installed in the container) using X11 forwarding to the SSH client:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

 

 

# node js yarn 

cat <<EOT > Dockerfile
FROM  node:lts-alpine3.19
RUN apk add openssh-server mc tar git nano screen nginx
RUN echo 'root:1' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo 'PermitRootLogin yes'  >> /etc/ssh/sshd_config
RUN mkdir /var/run/sshd
RUN ssh-keygen -A
EXPOSE 22 3000
CMD ["/usr/sbin/sshd", "-D"]
EOT
#
docker build -t yarn . 
docker run -d -p 3623:22 -p 3008:3000 yarn
ssh root@domain.ru -p3623

#
git config --global alias.h "log --pretty=format:'%h %ci | %s%d [%an]'  --all -5"
git config --global alias.l "log --oneline --decorate --graph --all -5"
git config --global alias.ll "log --decorate --graph --first-parent --no-merges -5"
git config --global alias.s status
git config --global push.default simple
git config --global credential.helper store

cat << EOT > /etc/nginx/http.d/app.conf
server {
    listen 3000 default_server;
    root /var/www/app/dist;
    try_files \$uri \$uri/ /index.html;
}
EOT