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
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