|
|
Line 1: |
Line 1: |
| ==Common commands==
| |
| <syntaxhighlight lang="bash">
| |
| docker build -t <name:latest> .
| |
| docker ps
| |
| docker logs <name>
| |
| docker stop <name>
| |
| docker rm <name>
| |
| docker run --name <name> --net=host -d -p 8000:5000 --rm -e MAIL_USERNAME=iwiseman -e ENVIRONMENT2=env2
| |
| # With Bash
| |
| docker exec -it <name> /bin/bash
| |
| # Without Bash
| |
| docker exec -it microblog /bin/sh
| |
| </syntaxhighlight>
| |
| '''Not''' --net=host allows you to connect to localhost e.g. localhost:3306 (mysql)
| |
| ===Other Commmand===
| |
| <syntaxhighlight lang="bash">
| |
| #Show the current docker image running
| |
| sudo docker ps
| |
|
| |
|
| #Show the images available
| |
| sudo docker images
| |
|
| |
| #Stop a container id
| |
| sudo docker stop <container id>
| |
|
| |
| #Start a container id
| |
| sudo docker stop <container id>
| |
|
| |
| #Show ports exposed
| |
| sudo docker port <container id>
| |
|
| |
| #List current containers
| |
| sudo docker container ls -s
| |
|
| |
| #Remove a container
| |
| sudo docker container rm <container id>
| |
|
| |
| #Pull a container
| |
| sudo docker pull <image name>
| |
|
| |
| #This will remove all images without at least one container associated to them
| |
| #docker image prune -a
| |
|
| |
| #This will remove all stopped containers
| |
| docker container prune
| |
| </syntaxhighlight>
| |
|
| |
| =Build Container=
| |
| ==RUN command==
| |
| RUN su-exec volpara git clone https://github.com/bibble235/aports
| |
|
| |
| ==Copying from on container==
| |
| Given the container
| |
| FROM ubuntu:18.04 AS opencv_build
| |
| Copying can be done using
| |
| COPY --from=opencv_build /usr/local/opencv/ /usr/local/
| |
|
| |
| == Creating a docker postgres image ==
| |
| This exposes the default port 5432 for postgres
| |
| docker run --name postgresq-spring -e POSTGRES_USER=iain -e POSTGRES_PASSWORD=password -p 5432:5432 -v /data:/var/lib/postgresql/data -d postgres:alpine
| |
|
| |
| The -d is to run the container in the background<br>
| |
| The postgres:alpine is the image name<br>
| |
| The -p is the port to expose which is the default for postgress
| |
| The -v is where the data will be stored
| |
|
| |
| == Volumes ==
| |
| List volumes
| |
| docker volume ls
| |
| Create a volumes
| |
| docker volume create hello
| |
| ==Running a Container==
| |
| Sample for running a container with name test, ip 172,18.0.11, network to run on as billnet, capital P to expose the port (not for production), remove container when exit, it to have the errors go to the host console, and ps/dataservice for the image name
| |
| docker run --name test --ip=172,18.0.11 --net=billnet -P --rm -it ps/dataservice
| |
|
| |
| =Build MediaWiki Container=
| |
| ==Build your own Docker Image==
| |
| Get the definition from github and build the container.
| |
| <syntaxhighlight lang="bash">
| |
| https://github.com/wikimedia/mediawiki-docker/blob/38d4e7f77f8b5b4efda91f969ccba2475fc2c597/1.35/apache/Dockerfile
| |
| docker build .
| |
| </syntaxhighlight>
| |
| ==Use Prebuilt==
| |
| We can install the prebuilt one with
| |
| <syntaxhighlight lang="bash">
| |
| docker pull mediawiki
| |
| </syntaxhighlight>
| |
| <br>
| |
| We can find the container with the command
| |
| <syntaxhighlight lang="bash">
| |
| docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Names}}"
| |
|
| |
| b0ff6611123e Up 2 minutes some-mediawiki
| |
| 898c8f40818d Up 6 hours k8s_operator_openshift-web...
| |
| b02230ae7074 Up 6 hours k8s_kube-dns_kube-dns-qhbvf_....
| |
| ea19641bc9a1 Up 6 hours k8s_webconsole_webconsole-...
| |
| 0dc6ee563a9b Up 6 hours k8s_registry_docker-registry-...
| |
| 0b6ea1064152 Up 6 hours k8s_operator_openshift-servic...
| |
| ...
| |
| </syntaxhighlight>
| |
| From there we can get the ip address with
| |
| <syntaxhighlight lang="bash">
| |
| docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' b0ff6611123e
| |
|
| |
| 172.17.0.9
| |
| </syntaxhighlight>
| |
| ==Delete Container==
| |
| We can stop the contain and delete it
| |
| <syntaxhighlight lang="bash">
| |
| docker stop b0ff6611123e
| |
| docker container rm b0ff6611123e
| |
| </syntaxhighlight>
| |
| =Docker Compose=
| |
| ==Simple MYSQL Compose Container==
| |
| This is an example of a mysql. The ports are changed to stop collision with desktop.
| |
| <syntaxhighlight lang="bash">
| |
| version: '3.8'
| |
|
| |
| networks:
| |
| default:
| |
|
| |
| services:
| |
| db:
| |
| image: mysql:5.7
| |
| container_name: conference_security
| |
| ports:
| |
| - 3307:3306
| |
| volumes:
| |
| - "./.data/db:/var/lib/mysql"
| |
| environment:
| |
| MYSQL_ROOT_PASSWORD: pass
| |
| MYSQL_DATABASE: TEST_DB
| |
| </syntaxhighlight>
| |
|
| |
| ==Creating A Container With Composer==
| |
| * Create a requirements.txt document with what is required for the container
| |
| * Create a Docker File definition
| |
| * Create a composer file
| |
| ==Django Container==
| |
| ===Requirements===
| |
| Here are the specific requirements for the Django cotainer.
| |
| <syntaxhighlight lang="bash">
| |
| Django==3.1.5
| |
| djangorestframework==3.12.2
| |
| mysqlclient==2.0.3
| |
| django-mysql==3.10.0
| |
| django-cors-headers==3.6.0
| |
| pika==1.1.0
| |
| </syntaxhighlight>
| |
| ===DockerFile===
| |
| This command runs the django app at start up
| |
| <syntaxhighlight lang="Dockerfile">
| |
| FROM python:3.9
| |
| ENV PYTHONNUMBUFFERED 1
| |
| WORKDIR /app
| |
| COPY requirements.txt /app/requirements.txt
| |
| RUN pip install -r requirements.txt
| |
| COPY . /app
| |
| </syntaxhighlight>
| |
| ===Yaml===
| |
| We can build a container using docker-compose. Create a docker file with
| |
| <syntaxhighlight lang="Dockerfile">
| |
| version: '3.8'
| |
| services:
| |
| django:
| |
| container_name: djangoapp
| |
| build:
| |
| context: .
| |
| dockerfile: Dockerfile
| |
| command: 'python3 manage.py runserver 0.0.0.0:8000'
| |
| ports:
| |
| - 8000:8000
| |
| volumes:
| |
| - .:/app
| |
| depends_on:
| |
| - db
| |
| networks:
| |
| django_demo:
| |
|
| |
| queue:
| |
| environment:
| |
| - PYTHONUNBUFFERED=1
| |
| build:
| |
| context: .
| |
| dockerfile: Dockerfile
| |
| container_name: djangoqueue
| |
| command: 'python3 consumer.py'
| |
| depends_on:
| |
| - db
| |
| networks:
| |
| django_demo:
| |
|
| |
| db:
| |
| image: mysql:5.7.32
| |
| container_name: djangodb
| |
| restart: always
| |
| environment:
| |
| MYSQL_DATABASE: admin
| |
| MYSQL_USER: root
| |
| MYSQL_PASSWORD: root
| |
| MYSQL_ROOT_PASSWORD: root
| |
| volumes:
| |
| - .dbdata:/var/lib/mysql
| |
| ports:
| |
| - 33066:3306
| |
| networks:
| |
| django_demo:
| |
|
| |
| networks:
| |
| django_demo:
| |
| external: true
| |
| </syntaxhighlight>
| |
| ==Flask Container==
| |
| ===Requirements===
| |
| Here are the specific requirements for the Flask container.
| |
| <syntaxhighlight lang="bash">
| |
| Flask==1.1.2
| |
| Flask-SQLAlchemy==2.4.4
| |
| SQLAlchemy==1.3.20
| |
| Flask-Migrate==2.5.3
| |
| Flask-Script==2.0.6
| |
| Flask-Cors==3.0.9
| |
| requests==2.25.0
| |
| mysqlclient==2.0.3
| |
| pika==1.1.0
| |
| </syntaxhighlight>
| |
| ===DockerFile===
| |
| This command runs the flask app at start up
| |
| <syntaxhighlight lang="Dockerfile">
| |
| FROM python:3.9
| |
| ENV PYTHONNUMBUFFERED 1
| |
| WORKDIR /app
| |
| COPY requirements.txt /app/requirements.txt
| |
| RUN pip install -r requirements.txt
| |
| COPY . /app
| |
| </syntaxhighlight>
| |
| ===Yaml===
| |
| We can build a container using docker-compose. Create a docker file with
| |
| <syntaxhighlight lang="Dockerfile">
| |
| version: '3.8'
| |
| services:
| |
| flask:
| |
| build:
| |
| context: .
| |
| dockerfile: Dockerfile
| |
| container_name: flaskapp
| |
| command: python main.py
| |
| ports:
| |
| - 8001:5000
| |
| volumes:
| |
| - .:/app
| |
| depends_on:
| |
| - db
| |
| networks:
| |
| django_demo:
| |
|
| |
| queue:
| |
| build:
| |
| context: .
| |
| dockerfile: Dockerfile
| |
| container_name: flaskqueue
| |
| command: 'python consumer.py'
| |
| depends_on:
| |
| - db
| |
| networks:
| |
| django_demo:
| |
|
| |
| db:
| |
| image: mysql:5.7.32
| |
| container_name: flaskdb
| |
| restart: always
| |
| environment:
| |
| MYSQL_DATABASE: main
| |
| MYSQL_USER: root
| |
| MYSQL_PASSWORD: root
| |
| MYSQL_ROOT_PASSWORD: root
| |
| volumes:
| |
| - .dbdata:/var/lib/nysql
| |
| ports:
| |
| - 33067:3306
| |
| networks:
| |
| django_demo:
| |
|
| |
| networks:
| |
| django_demo:
| |
| external: true
| |
| </syntaxhighlight>
| |
|
| |
| =Networking with Docker Compose=
| |
| ==General==
| |
| In order to connect on the network container to container I ended up setting up my own network.
| |
| <syntaxhighlight lang="bash">
| |
| docker network create --attachable django_demo
| |
| </syntaxhighlight>
| |
| Once we have the network we can assign the containers to the network by setting the network name and the network in this case django_demo
| |
| <syntaxhighlight lang="yaml">
| |
| version: '3.8'
| |
| services:
| |
| django:
| |
| container_name: djangoapp
| |
| build:
| |
| context: .
| |
| dockerfile: Dockerfile
| |
| command: 'python manage.py runserver 0.0.0.0:8000'
| |
| ports:
| |
| - 8000:8000
| |
| volumes:
| |
| - .:/app
| |
| depends_on:
| |
| - db
| |
| networks:
| |
| django_demo:
| |
| ...
| |
|
| |
| networks:
| |
| django_demo:
| |
| external: true
| |
| </syntaxhighlight>
| |
| We need to specify the container_name because the default is to use the service name an, underscore and a number which in this case would have been django_1. This creates an invalid host as the underscore is not allowed.
| |
| ==Commands==
| |
| We can see the network with
| |
| <syntaxhighlight lang="bash">
| |
| docker network inspect django_demo
| |
| </syntaxhighlight>
| |
| We can delete network with
| |
| <syntaxhighlight lang="bash">
| |
| docker network prune
| |
| </syntaxhighlight>
| |
| And we can see the containers with
| |
| <syntaxhighlight lang="bash">
| |
| docker ps
| |
| </syntaxhighlight>
| |
| ==Django Specific==
| |
| ===Allowed Hosts===
| |
| To ensure no errors we need to specify which hosts django allows. This is done in the settings.py. In this example the container name for the app is put in the allowed list.
| |
| <syntaxhighlight lang="python">
| |
| ...
| |
| ALLOWED_HOSTS = ['127.0.0.1','djangoapp']
| |
| ...
| |
| </syntaxhighlight>
| |
| ===App Database Connection===
| |
| We need to also need to account for the hostname when using the container_name in the docker-compose yml
| |
| <syntaxhighlight lang="python">
| |
| DATABASES = {
| |
| 'default': {
| |
| 'ENGINE': 'django.db.backends.mysql',
| |
| 'NAME': 'dont',
| |
| 'USER': 'copy',
| |
| 'PASSWORD': 'this',
| |
| 'HOST': 'djangodb',
| |
| 'PORT': '3306'
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| ==Flask==
| |
| ===App Database Connection===
| |
| In this case I created a flask app so the database is specified in the main.py in the SQLALCHEMY_DATABASE_URI. Here we use the hostname for URI.
| |
| <syntaxhighlight lang="python">
| |
| app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@flaskdb/main'
| |
| </syntaxhighlight>
| |
|
| |
| ===Container to Container===
| |
| To call the django service we do this by using the hostname of the django service. In our case.
| |
| <syntaxhighlight lang="python">
| |
| ...
| |
| req = requests.get('http://djangoapp:8000/api/user')
| |
| return jsonify(req.content.decode('utf-8'))
| |
| </syntaxhighlight>
| |