User Tools

Site Tools


docker

This is an old revision of the document!


Docker basics

Installation

Read the docs

Web interface

use “portainer” Github repo

Remote API

use “sherpa” Github repo

Websites

Nginx + php-fpm

Create files

  1. Create a folder that will contain the config files and go inside. (The containers names will take the name of the folder)
  2. Create a folder named “www” (that will be mounted in /srv/www (equivalent of /var/www))
  3. Create a folder ./www/first_website and put your php code inside
  4. Create a folder ./www/second_website and put your php code inside
  5. Create a folder named “conf.d” (that will be mounted in /etc/nginx/conf.d)
  6. Create the following files :

docker-compose.yml

nginx:
    image: nginx:latest
    ports:
        - "8080:80"
    volumes:
        - ./www:/srv/www
        - ./conf.d:/etc/nginx/conf.d
    links:
        - php
php:
    image: php:7-fpm
    volumes:
        - ./www:/srv/www

./conf.d/site.conf

server {
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /srv/www/first_website;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

./conf.d/site2.conf

server {
    index index.php index.html;
    server_name php-docker2.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /srv/www/second_website;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Run the containers

docker-compose up

Mysql

  docker run \
   --name="mysql-dck" \
   -v "/path/to/my.cnf":"/etc/my.cnf" \
   -e MYSQL_ROOT_PASSWORD=mypassword \
   -e MYSQL_ROOT_HOST=172.17.0.1 \
   -d \
    mysql/mysql-server:5.6
Note: i was not able to use root credentials as /root/.my.cnf

Script to write to mysql

First solution

add this line to the previous command :

-v /tmp/mysql-temp:/tmp \
run this command :
docker exec mysql-dck /bin/sh -c 'mysql -u root -pmypassword < /tmp/mysql-temp/test-create.sql'
content of the file “test-create.sql” :
CREATE DATABASE IF NOT EXISTS `mybase` DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON `mybase`.* TO 'foo'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Second solution

run :

docker exec mysql-dck /bin/sh -c 'mysql -u root -pmypassword -e "CREATE DATABASE IF NOT EXISTS `mybase` DEFAULT CHARACTER SET utf8"'
docker exec mysql-dck /bin/sh -c 'mysql -u root -pmypassword -e "GRANT ALL PRIVILEGES ON `mybase`.* TO \'foo\'@\'localhost\' IDENTIFIED BY \'password\' WITH GRANT OPTION;"'
docker exec mysql-dck /bin/sh -c 'mysql -u root -pmypassword -e "FLUSH PRIVILEGES;"'

Docker and OpenSimulator (work in progress)

Dockerfile

# start from this image
FROM mono:5.2.0.215

# create an "opensim" user
RUN useradd -ms /bin/bash opensim

# get the opensim bin folder
COPY opensim.tar.gz /home/opensim/opensimulator/opensim.tar.gz

WORKDIR /home/opensim/opensimulator
RUN tar -zxf opensim.tar.gz && rm opensim.tar.gz

WORKDIR /home/opensim/opensimulator/bin

USER opensim

ENTRYPOINT ["mono", "--server", "OpenSim.exe"]
#CMD ["mono", "--server", "OpenSim.exe"]

#!/bin/bash

HOST_IP="192.168.1.217"

DEFAULT_SIMNAME="opensimulator"
# check if params
if [ $# -lt 1 ];then
  echo "Simulator name was not set so default is opensimulator"
else
  DEFAULT_SIMNAME=$1
fi

# get port
SIMPORT=$(/srv/docker/get_port opensimulator)

# define the sim name
SIMNAME="opensimulator-${SIMPORT}"
RADMINPORT=$((${SIMPORT} + 1))
REGIONPORT_START=$((${RADMINPORT} + 1))
REGIONPORT_END=$((${REGIONPORT_START} + 97))

# check if config folder exists
if [ ! -d "/srv/docker/opensimulator/sims/${SIMNAME}" ]; then
        cp -r "/srv/docker/opensimulator/sims/default" "/srv/docker/opensimulator/sims/${SIMNAME}"
fi

# add the config to the inis
cat <<EOM > "/srv/docker/opensimulator/sims/${SIMNAME}/config/02-network.ini"
[Const]
BaseHostname = "${HOST_IP}"
PublicPort = "${SIMPORT}"
PrivatePort = "${SIMPORT}"

[Network]
http_listener_port = ${SIMPORT}

[RemoteAdmin]
enabled = true
port = ${RADMINPORT}
access_password = "test"
enabled_methods = all
EOM

# run the container
 docker run \
 -d \
--name=${SIMNAME} \
-v /srv/docker/opensimulator/sims/${SIMNAME}/config:/home/opensim/opensimulator/bin/config \
-v /srv/docker/opensimulator/sims/${SIMNAME}/config-include:/home/opensim/opensimulator/bin/config-include \
-v /srv/docker/opensimulator/sims/${SIMNAME}/archives:/home/opensim/opensimulator/bin/archives \
-v /srv/docker/opensimulator/sims/${SIMNAME}/log:/home/opensim/opensimulator/bin/log \
-v /srv/docker/opensimulator/sims/${SIMNAME}/OpenSim.exe.config:/home/opensim/opensimulator/bin/OpenSim.exe.config \
--link mysql-dck:mysql \
-p ${SIMPORT}:${SIMPORT} \
-p ${RADMINPORT}:${RADMINPORT} \
-p ${REGIONPORT_START}-${REGIONPORT_END}:${REGIONPORT_START}-${REGIONPORT_END}/udp \
opensimulator
File to get port “get_port”
#!/bin/bash

# check if params
if [ $# -lt 1 ];then
  echo $"Usage : get_next_available_sim_port <SIM_NAME>"
  exit;
fi

i="10100"
status=false
PORTS_FILE="/srv/docker/ports"

while [ $status = false  ]
do
  cat "${PORTS_FILE}" | grep $i &> /dev/null
  if [ ! $? -eq 0 ]; then
    echo "${i}"
    echo "${1};${i}" >> "${PORTS_FILE}"
    status=true
  fi
  i=$[$i+100]
  if [ $i -gt 48000 ]; then
    status=true
    exit 1
  fi
done
Script to delete port “delete-port”
#!/bin/bash

# check if params
if [ $# -lt 1 ];then
  echo $"Usage : delete_port <SIM_NAME>"
  exit;
fi

PORTS_FILE="/srv/docker/ports"
#sed -i '/${1}/d' ${PORTS_FILE}
grep -v "${1}" ${PORTS_FILE} > temp; mv temp ${PORTS_FILE}

Some notes

Get container name

Get containers containing the letter “t” in name.

docker ps -a --format '{{.Names}}' --filter "name=t"

Get exposed ports

docker inspect --format='{{range $p, $conf := .HostConfig.PortBindings}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' containername

Docker one mysql instance

Run the container

docker run --detach --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" mysql

Get container ip

This is optionnal but noted as reference.

docker inspect test-mysql | grep IPAddress

Run client

docker run --detach --name test-debian --link test-mysql:mysql debian

Enter client

docker exec -it test-debian bash
See that the ip is mapped in /etc/hosts.

Expose to the outside

docker run --detach --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" --publish 6603:3306 mysql
The mysql server will be accessible from the outside on the port 6603.

User Namespaces

Source Source2

BEWARE IT CAN BREAK AN OLD DOCKER INSTALLATION !!!

groupadd -g 500000 dockremap && 
      groupadd -g 501000 dockremap-user && 
      useradd -u 500000 -g dockremap -s /bin/false dockremap && 
      useradd -u 501000 -g dockremap-user -s /bin/false dockremap-user
echo "dockremap:500000:65536" >> /etc/subuid && 
    echo "dockremap:500000:65536" >>/etc/subgid
{
    "userns-remap": "default"
}
systemctl daemon-reload && systemctl restart docker

Portainer

in normal mode :

docker run -d --privileged -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer
in usernamespace mode :
docker run -d --privileged --userns=host -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer

docker.1511209202.txt.gz · Last modified: (external edit)