Difference between revisions of "Docker"

From RHS Wiki
Jump to navigation Jump to search
Tag: visualeditor
 
(29 intermediate revisions by the same user not shown)
Line 1: Line 1:
= Install =
+
=Install=
curl -sSL https://get.docker.com/ | sh
+
[https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker-CE]<br />
 +
[https://docs.docker.com/compose/install/ Docker-compose]<br />
  
docker pull python:2.7
+
<source lang="bash">sudo apt-get remove docker docker-engine docker.io
docker run -i -t python:2.7
+
sudo apt-get update
docker docker run -i -t python:2.7 bash
+
sudo apt-get install    apt-transport-https    ca-certificates    curl    software-properties-common
docker ps -a
+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
docker pull linuxkonsult/kali-metasploit
+
sudo apt-key fingerprint 0EBFCD88
docker search kali
+
sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
 +
$(lsb_release -cs) \
 +
stable"
 +
apt-get update
 +
# At production usse specific version:
 +
apt-cache madison docker-ce
 +
apt-get install docker-ce=18.03.0~ce-0~ubuntu 
 +
# Otherwise apt install docker-ce
 +
sudo curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
 +
chmod +x /usr/local/bin/docker-compose
 +
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.20.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
 +
### old: curl -sSL https://get.docker.com/ | sh</source>
  
  docker images
+
==Docker Swarm==
  docker run -i -t linuxkonsult/kali-metasploit bash
+
<source lang="bash">docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER>
 +
  docker network create -d overlay nginx-proxy
 +
  docker pull postgres:10.6 && docker pull redis:3.2-alpine && docker pull jwilder/nginx-proxy</source>
 
   
 
   
  # Remove all containers
+
==Examples==
docker rm $(docker ps -aq)   
+
<source lang="bash">docker pull python:2.7
 +
docker run -i -t python:2.7
 +
docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=owncloud\\.rra\\.lan' --restart always --cap-add MKNOD collabora/code
 +
docker docker run -i -t python:2.7 bash
 +
docker ps -a
 +
docker pull linuxkonsult/kali-metasploit
 +
docker search kali
 +
docker run -ti -v "/home/rafa/LocalPath:/ContainerPath" git.rra.lan:4443/docker/pilaf_testrunner/converter:latest /bin/bash  # mounts local path folder on docker container
 +
 
 +
# Run container with name and volumes
 +
docker run -t -d -p 0.0.0.0:9980:9980  -e "server_name=owncloud\\.rra\\.lan" -v "/etc/collabora/certs:/etc/loolwsd/certs" -e "domain=owncloud\\.rra\\.lan" --restart always --cap-add MKNOD --name collabora collabora/code
 +
 
 +
# View logs
 +
docker logs -f collabora
 +
 
 +
docker images
 +
docker run -i -t linuxkonsult/kali-metasploit bash
 +
 +
# Remove all containers
 +
docker kill $(docker ps -q) && docker rm $(docker ps -aq)   
 
   
 
   
#  Remove incompletely built images:
+
# Remove one image
docker images | grep none | awk '{print "docker rmi " $3;}' | sh
+
docker rmi ae024c7584a3
 +
#  Remove incompletely built images:
 +
docker images | grep -v IMAGE\ ID | awk '{print "docker rmi " $3;}'</source>
  
= Restart stopped container with diferent command =
+
==Docker container root shell==
 +
<syntaxhighlight lang="bash">
 +
docker exec -u 0 -it cranky_neumann /bin/bash
 +
</syntaxhighlight>
 +
 
 +
=Restart stopped container with diferent command=
 
Find your stopped container id
 
Find your stopped container id
docker ps -a
+
<source lang="bash">docker ps -a</source>
 
Commit the stopped container:
 
Commit the stopped container:
 
This command saves modified container state into a new image user/test_image
 
This command saves modified container state into a new image user/test_image
docker commit $CONTAINER_ID user/test_image
+
<source lang="bash">docker commit $CONTAINER_ID user/test_image</source>
 
Start/run with a different entry point:
 
Start/run with a different entry point:
docker run -ti --entrypoint=sh user/test_image
+
<source lang="bash">docker run -ti --entrypoint=sh user/test_image</source>
  
== Restart exited container ==
+
==Restart exited container==
docker start  `docker ps -q -l` # restart it in the background
+
<source lang="bash">docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin
+
docker attach `docker ps -q -l` # reattach the terminal & stdin</source>
  
== Create & Publish image ==
+
==Create & Publish image==
mkdir rpi_python
+
<source lang="bash">mkdir rpi_python
nano rpi_python/Dockerfile
+
nano rpi_python/Dockerfile</source>
  
Docekerfile
+
==Docekerfile==
<nowiki># Pull base image
+
<source lang="dockerfile"># Pull base image
 
FROM resin/rpi-raspbian:wheezy
 
FROM resin/rpi-raspbian:wheezy
 
MAINTAINER Dieter Reuter <dieter@hypriot.com>
 
MAINTAINER Dieter Reuter <dieter@hypriot.com>
 
+
 
 
# Install dependencies
 
# Install dependencies
 
RUN apt-get update && apt-get install -y \
 
RUN apt-get update && apt-get install -y \
Line 48: Line 88:
 
     --no-install-recommends && \
 
     --no-install-recommends && \
 
     rm -rf /var/lib/apt/lists/*
 
     rm -rf /var/lib/apt/lists/*
 
+
 
 
# Define working directory
 
# Define working directory
 
WORKDIR /data
 
WORKDIR /data
 +
 
 +
# Define default command
 +
CMD ["bash"]</source>
 +
 +
<source lang="bash">docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 .
 +
# Or with multiple tags
 +
docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 -t DOCKER_HUB_USERNAME/rpi_python:latest .
 +
# List images
 +
docker images
 +
# Test image
 +
docker run -rm -it DOCKER_HUB_USERNAME/rpi_python:0.0.1
 +
# Login
 +
docker login
 +
docker push DOCKER_HUB_USERNAME/rpi_python:0.0.1</source>
 +
 +
===Pull Modify Commit===
 +
<source lang="bash">sudo docker pull ubuntu
 +
sudo docker run ubuntu apt-get install -y ping</source>
 +
 +
Then get the container id using this command:
 +
<source lang="bash">sudo docker ps -l</source>
 +
Commit changes to the container:
 +
<source lang="bash">sudo docker commit <container_id> iman/ping</source>
 +
Then run the container:
 +
<source lang="bash">sudo docker run iman/ping ping www.google.com</source>
 +
 +
==Docker mirror==
 +
<syntaxhighlight lang="bash">
 +
#!/bin/bash
 +
 +
# PULL
 +
docker login gitrra.dyndns.org:4443
 +
docker login git.rra.lan:4443
 +
 +
FROM=gitrra.dyndns.org:4443/rra/pdgrt/deployment/
 +
TO=git.rra.lan:4443/pdgrt_2.0_mirror/deployment/
 +
 +
REPOS="pdgrt-central-frontend pdgrt-proxy-frontend pdgrt-node-frontend pdgrt-proxy-backend/django pdgrt-proxy-backend/nginx pdgrt-node-backend/django pdgrt-node-backend/nginx pdgrt-central-backend/django pdgrt-central-backend/nginx"
 +
 +
 +
for repo in ${REPOS}; do
 +
    docker pull ${FROM}${repo}
 +
    docker tag ${FROM}${repo} ${TO}${repo}
 +
    docker push ${TO}${repo}
 +
done
 +
 +
</syntaxhighlight>
 +
 +
==Run command on running container==
 +
<syntaxhighlight lang="bash">
 +
docker exec -ti es01 /bin/bash
 +
</syntaxhighlight>
 +
 +
==Dockerfile reference==
 +
https://docs.docker.com/engine/reference/builder/
 +
 +
==Docker custom registry==
 +
<code>docker run --rm -v test-volume:/contents registry.roqs.basf.net/base-images/alpine ls /</code>
 +
 +
<br />
 +
 +
==Docker-compose==
 +
===Use this docker compose to run the project locally===
 +
 +
*To start all services:
 +
 +
  <code>docker-compose up --build --remove-orphans --detach</code>
 +
 +
*To restart only one service:
 +
 +
  <code>docker-compose up --build --remove-orphans --detach &lt;service_name&gt;</code>
 +
 +
*To stop one service:
 +
 +
  <code>docker-compose stop &lt;service_name&gt;</code>
 +
 +
*To stop all services:
 +
 +
  <code>docker-compose down</code>
 +
 +
*To view logs of a service:
 +
 +
  <code>docker-compose logs -f &lt;service_name&gt;</code>
 +
 +
*To view logs of all services:
 +
 +
  <code>docker-compose logs -f</code>
 +
 +
=== docker-compose.yml example for multiple services ===
 +
<syntaxhighlight lang="yaml">
 +
 +
version: '3.8'
  
# Define default command
+
services:
CMD ["bash"]</nowiki>
+
  postgres:
 +
    image: postgres:14.13
 +
    environment:
 +
      POSTGRES_DB: mydatabase
 +
      POSTGRES_USER: myuser
 +
      POSTGRES_PASSWORD: mypassword
 +
    volumes:
 +
      - postgres_data:/var/lib/postgresql/data
 +
    ports:
 +
      - "5432:5432"
 +
 
 +
  redis:
 +
    image: redis:latest
 +
    ports:
 +
      - "6379:6379"
 +
 
 +
  celery:
 +
    build:
 +
        context: .
 +
        dockerfile: Dockerfile
 +
    environment:
 +
      DJANGO_SETTINGS_MODULE: app.settings
 +
      REDIS_HOST: redis
 +
      DB_HOST: postgres
 +
      DB_PORT: 5432
 +
      DB_NAME: mydatabase
 +
      DB_USER: myuser
 +
      DB_PASSWORD: mypassword
 +
 
 +
    volumes:
 +
      - .:/app
 +
      - ./media:/app/media
 +
    working_dir: /app
 +
    command: celery -A app worker --loglevel=info
 +
    depends_on:
 +
      - postgres
 +
      - redis
 +
 
 +
  flower:
 +
    build:
 +
        context: .
 +
        dockerfile: Dockerfile
 +
    environment:
 +
      DJANGO_SETTINGS_MODULE: app.settings
 +
      DB_HOST: postgres
 +
      DB_NAME: mydatabase
 +
      DB_USER: myuser
 +
      DB_PASSWORD: mypassword
 +
      REDIS_HOST: redis
 +
    volumes:
 +
      - .:/app
 +
      - ./media:/app/media
 +
    working_dir: /app
 +
    command: celery -A app flower --loglevel=info --basic-auth=admin:admin
 +
    depends_on:
 +
      - postgres
 +
      - redis
 +
    ports:
 +
      - "5555:5555"
 +
 
 +
  django:
 +
    build:
 +
      context: .
 +
      dockerfile: Dockerfile
 +
    environment:
 +
      DJANGO_SETTINGS_MODULE: app.settings
 +
      REDIS_HOST: redis
 +
      DB_HOST: postgres
 +
      DB_PORT: 5432
 +
      DB_NAME: mydatabase
 +
      DB_USER: myuser
 +
      DB_PASSWORD: mypassword
 +
    volumes:
 +
      - .:/app
 +
      - ./media:/app/media
 +
    working_dir: /app
 +
    command: python3 manage.py runserver 0.0.0.0:8000
 +
    depends_on:
 +
      - postgres
 +
      - redis
 +
    ports:
 +
      - "8000:8000"
 +
 
 +
volumes:
 +
  postgres_data:
 +
    driver: local
  
docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 .
+
</syntaxhighlight><br />
# Or with multiple tags
 
docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 -t DOCKER_HUB_USERNAME/rpi_python:latest .
 
# List images
 
docker images
 
# Test image
 
docker run -rm -it DOCKER_HUB_USERNAME/rpi_python:0.0.1
 
# Login
 
docker login
 
docker push DOCKER_HUB_USERNAME/rpi_python:0.0.1
 

Latest revision as of 09:26, 22 August 2025

Install[edit]

Docker-CE
Docker-compose

sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install     apt-transport-https     ca-certificates     curl     software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get update
# At production usse specific version:
apt-cache madison docker-ce
apt-get install docker-ce=18.03.0~ce-0~ubuntu  
# Otherwise apt install docker-ce
sudo curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.20.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
### old: curl -sSL https://get.docker.com/ | sh

Docker Swarm[edit]

docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER>
 docker network create -d overlay nginx-proxy
 docker pull postgres:10.6 && docker pull redis:3.2-alpine && docker pull jwilder/nginx-proxy

Examples[edit]

docker pull python:2.7
docker run -i -t python:2.7
docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=owncloud\\.rra\\.lan' --restart always --cap-add MKNOD collabora/code
docker docker run -i -t python:2.7 bash
docker ps -a
docker pull linuxkonsult/kali-metasploit
docker search kali
docker run -ti -v "/home/rafa/LocalPath:/ContainerPath" git.rra.lan:4443/docker/pilaf_testrunner/converter:latest /bin/bash  # mounts local path folder on docker container

# Run container with name and volumes
docker run -t -d -p 0.0.0.0:9980:9980  -e "server_name=owncloud\\.rra\\.lan" -v "/etc/collabora/certs:/etc/loolwsd/certs" -e "domain=owncloud\\.rra\\.lan" --restart always --cap-add MKNOD --name collabora  collabora/code

# View logs 
docker logs -f collabora

docker images
docker run -i -t linuxkonsult/kali-metasploit bash
 
# Remove all containers
docker kill $(docker ps -q) && docker rm $(docker ps -aq)  
 
# Remove one image
docker rmi ae024c7584a3
#  Remove incompletely built images:
docker images | grep -v IMAGE\ ID | awk '{print "docker rmi " $3;}'

Docker container root shell[edit]

docker exec -u 0 -it cranky_neumann /bin/bash

Restart stopped container with diferent command[edit]

Find your stopped container id

docker ps -a

Commit the stopped container: This command saves modified container state into a new image user/test_image

docker commit $CONTAINER_ID user/test_image

Start/run with a different entry point:

docker run -ti --entrypoint=sh user/test_image

Restart exited container[edit]

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin

Create & Publish image[edit]

mkdir rpi_python
nano rpi_python/Dockerfile

Docekerfile[edit]

# Pull base image
FROM resin/rpi-raspbian:wheezy
MAINTAINER Dieter Reuter <dieter@hypriot.com>
   
# Install dependencies
RUN apt-get update && apt-get install -y \
    python \
    python-dev \
    python-pip \
    python-virtualenv \
    --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*
   
# Define working directory
WORKDIR /data
   
# Define default command
CMD ["bash"]
docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 .
# Or with multiple tags
docker build -t DOCKER_HUB_USERNAME/rpi_python:0.0.1 -t DOCKER_HUB_USERNAME/rpi_python:latest .
# List images
docker images
# Test image
docker run -rm -it DOCKER_HUB_USERNAME/rpi_python:0.0.1
# Login
docker login
docker push DOCKER_HUB_USERNAME/rpi_python:0.0.1

Pull Modify Commit[edit]

sudo docker pull ubuntu
sudo docker run ubuntu apt-get install -y ping

Then get the container id using this command:

sudo docker ps -l

Commit changes to the container:

sudo docker commit <container_id> iman/ping

Then run the container:

sudo docker run iman/ping ping www.google.com

Docker mirror[edit]

#!/bin/bash

# PULL
docker login gitrra.dyndns.org:4443
docker login git.rra.lan:4443

FROM=gitrra.dyndns.org:4443/rra/pdgrt/deployment/
TO=git.rra.lan:4443/pdgrt_2.0_mirror/deployment/

REPOS="pdgrt-central-frontend pdgrt-proxy-frontend pdgrt-node-frontend pdgrt-proxy-backend/django pdgrt-proxy-backend/nginx pdgrt-node-backend/django pdgrt-node-backend/nginx pdgrt-central-backend/django pdgrt-central-backend/nginx"


for repo in ${REPOS}; do
    docker pull ${FROM}${repo}
    docker tag ${FROM}${repo} ${TO}${repo}
    docker push ${TO}${repo}
done

Run command on running container[edit]

docker exec -ti es01 /bin/bash

Dockerfile reference[edit]

https://docs.docker.com/engine/reference/builder/

Docker custom registry[edit]

docker run --rm -v test-volume:/contents registry.roqs.basf.net/base-images/alpine ls /


Docker-compose[edit]

Use this docker compose to run the project locally[edit]

  • To start all services:
 docker-compose up --build --remove-orphans --detach
  • To restart only one service:
 docker-compose up --build --remove-orphans --detach <service_name>
  • To stop one service:
 docker-compose stop <service_name>
  • To stop all services:
 docker-compose down
  • To view logs of a service:
 docker-compose logs -f <service_name>
  • To view logs of all services:
 docker-compose logs -f

docker-compose.yml example for multiple services[edit]

version: '3.8'

services:
  postgres:
    image: postgres:14.13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:latest
    ports:
      - "6379:6379"

  celery:
    build:
        context: .
        dockerfile: Dockerfile
    environment:
      DJANGO_SETTINGS_MODULE: app.settings
      REDIS_HOST: redis
      DB_HOST: postgres
      DB_PORT: 5432
      DB_NAME: mydatabase
      DB_USER: myuser
      DB_PASSWORD: mypassword

    volumes:
      - .:/app
      - ./media:/app/media
    working_dir: /app
    command: celery -A app worker --loglevel=info
    depends_on:
      - postgres
      - redis

  flower:
    build:
        context: .
        dockerfile: Dockerfile
    environment:
      DJANGO_SETTINGS_MODULE: app.settings
      DB_HOST: postgres
      DB_NAME: mydatabase
      DB_USER: myuser
      DB_PASSWORD: mypassword
      REDIS_HOST: redis
    volumes:
      - .:/app
      - ./media:/app/media
    working_dir: /app
    command: celery -A app flower --loglevel=info --basic-auth=admin:admin
    depends_on:
      - postgres
      - redis
    ports:
      - "5555:5555"

  django:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      DJANGO_SETTINGS_MODULE: app.settings
      REDIS_HOST: redis
      DB_HOST: postgres
      DB_PORT: 5432
      DB_NAME: mydatabase
      DB_USER: myuser
      DB_PASSWORD: mypassword
    volumes:
      - .:/app
      - ./media:/app/media
    working_dir: /app
    command: python3 manage.py runserver 0.0.0.0:8000
    depends_on:
      - postgres
      - redis
    ports:
      - "8000:8000"

volumes:
  postgres_data:
    driver: local