Docker 2

From bibbleWiki
Jump to navigation Jump to search

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
The postgres:alpine is the image name
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.

https://github.com/wikimedia/mediawiki-docker/blob/38d4e7f77f8b5b4efda91f969ccba2475fc2c597/1.35/apache/Dockerfile
docker build .

Use Prebuilt

We can install the prebuilt one with

docker pull mediawiki


We can find the container with the command

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

From there we can get the ip address with

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

172.17.0.9

Delete Container

We can stop the contain and delete it

docker stop b0ff6611123e
docker container rm b0ff6611123e

Networking with Docker Compose

General

In order to connect on the network container to container I ended up setting up my own network.

docker network create --attachable django_demo

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

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

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

docker network inspect django_demo

We can delete network with

docker network prune

And we can see the containers with

docker ps

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.

...
ALLOWED_HOSTS = ['127.0.0.1','djangoapp']
...

App Database Connection

We need to also need to account for the hostname when using the container_name in the docker-compose yml

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dont',
        'USER': 'copy',
        'PASSWORD': 'this',
        'HOST': 'djangodb',
        'PORT': '3306'
    }
}

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.

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@flaskdb/main'

Container to Container

To call the django service we do this by using the hostname of the django service. In our case.

...
  req = requests.get('http://djangoapp:8000/api/user') 
  return jsonify(req.content.decode('utf-8'))