picatz / goldengirl

✨ All that shimmers is gold!
MIT License
3 stars 0 forks source link

implement mysql server with docker #20

Closed picatz closed 6 years ago

picatz commented 6 years ago

I found this example: https://github.com/docker-library/mysql

picatz commented 6 years ago

Getting started running things manually:

sudo docker pull mysql
sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql &
sudo docker exec -it some-mysql bash
picatz commented 6 years ago

Official Mysql 8.0 Dockerfile:

FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql

# add gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
    && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
    && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
    && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true \
    && apt-get purge -y --auto-remove ca-certificates wget

RUN mkdir /docker-entrypoint-initdb.d

RUN apt-get update && apt-get install -y --no-install-recommends \
# for MYSQL_RANDOM_ROOT_PASSWORD
        pwgen \
# for mysql_ssl_rsa_setup
        openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
        perl \
    && rm -rf /var/lib/apt/lists/*

RUN set -ex; \
# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
    key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; \
    export GNUPGHOME="$(mktemp -d)"; \
    gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    gpg --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; \
    rm -r "$GNUPGHOME"; \
    apt-key list > /dev/null

ENV MYSQL_MAJOR 8.0
ENV MYSQL_VERSION 8.0.3-rc-1debian8

RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list

# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
        echo mysql-community-server mysql-community-server/data-dir select ''; \
        echo mysql-community-server mysql-community-server/root-pass password ''; \
        echo mysql-community-server mysql-community-server/re-root-pass password ''; \
        echo mysql-community-server mysql-community-server/remove-test-db select false; \
    } | debconf-set-selections \
    && apt-get update && apt-get install -y mysql-community-client-core="${MYSQL_VERSION}" mysql-community-server-core="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
    && chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
    && chmod 777 /var/run/mysqld

VOLUME /var/lib/mysql
# Config files
COPY config/ /etc/mysql/
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 3306
CMD ["mysqld"]
picatz commented 6 years ago

We need to expose the docker (mysql) port 3306 to our localhost using -p 3306:3306

sudo docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql &
mysql -h localhost -P 3306 --protocol=tcp -u root -p
# enter password and you're connected from your host to the docker mysql instance
picatz commented 6 years ago

Inspect the instance with inspect:

[root@goldengirl vagrant]# docker inspect mysql
[
    {
        "Id": "df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c",
        "Created": "2018-01-24T12:13:32.099097404Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "mysqld"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 30642,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-01-24T12:13:32.805957692Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:f008d8ff927dc527c5a57251b45cead7c9259c16a6a93c144f397eaafc103d36",
        "ResolvConfPath": "/var/lib/docker/containers/df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c/hostname",
        "HostsPath": "/var/lib/docker/containers/df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c/hosts",
        "LogPath": "/var/lib/docker/containers/df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c/df6cdf7b922b308b338bd529776d373ad5414f07cba989f08026c50aa17f9b9c-json.log",
        "Name": "/mysql",
        "RestartCount": 0,
        "Driver": "devicemapper",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "3306/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "3306"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "DeviceId": "17",
                "DeviceName": "docker-253:0-134924590-43f7302e02a40acedf459e05e169b2ca511eefa98d4b4f940cca3b9d0beaad84",
                "DeviceSize": "10737418240"
            },
            "Name": "devicemapper"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "a78800d896c35ee255c364d8b557c04cce3044d382ccf986ac1cfb4bbfa83d04",
                "Source": "/var/lib/docker/volumes/a78800d896c35ee255c364d8b557c04cce3044d382ccf986ac1cfb4bbfa83d04/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "df6cdf7b922b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "3306/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "MYSQL_ROOT_PASSWORD=my-secret-pw",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.7",
                "MYSQL_MAJOR=5.7",
                "MYSQL_VERSION=5.7.21-1debian8"
            ],
            "Cmd": [
                "mysqld"
            ],
            "ArgsEscaped": true,
            "Image": "mysql",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "6c76643407c8c14608c257291915923f277273f8fe71ec7d4080cf7ab2574a18",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "3306/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "3306"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/6c76643407c8",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "571bc8b4091ae8dff0567f3ce9f1d630fca8b51b2c1396179b98f451e0e2341d",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f80a90a06a8a354c515f5e7dc1d190a19c5810538ac7136cb33a8f77fffa255e",
                    "EndpointID": "571bc8b4091ae8dff0567f3ce9f1d630fca8b51b2c1396179b98f451e0e2341d",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
picatz commented 6 years ago

Stop the mysql docker instance:

docker stop mysql

Start it back up:

docker start mysql
picatz commented 6 years ago

Now you're done with mysql instance ( this is the name ):

docker rm mysql
picatz commented 6 years ago

Examples in Context

[root@goldengirl vagrant]# docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql 
19ff08c6de1d91f6572f34786f3ed7abd6f5104634ba7838b0564a65dcd26079
[root@goldengirl vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
19ff08c6de1d        mysql               "docker-entrypoint.s…"   8 seconds ago       Up 8 seconds        0.0.0.0:3306->3306/tcp   mysql
[root@goldengirl vagrant]# docker stop mysql
mysql
[root@goldengirl vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
19ff08c6de1d        mysql               "docker-entrypoint.s…"   29 seconds ago      Exited (0) 4 seconds ago                       mysql
[root@goldengirl vagrant]# docker start mysql
mysql
[root@goldengirl vagrant]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
19ff08c6de1d        mysql               "docker-entrypoint.s…"   41 seconds ago      Up 2 seconds        0.0.0.0:3306->3306/tcp   mysql
[root@goldengirl vagrant]# docker logs mysql
picatz commented 6 years ago

Dockerfile

## Pull the mysql:8.0 image
FROM mysql:8.0

## Set password
ENV MYSQL_ROOT_PASSWORD my-secret-pw

## The maintainer name and email
MAINTAINER Kent 'picat' Gruber <kgruber1@emich.edu>
$ ls
Dockerfile
$ pwd
somedir

Let's build the image ( defined in the Dockerfile ) now.

$ docker build -t mysql-example .

We can check what images we have:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql-example       latest              e341b90f44b7        3 minutes ago       343MB
...

Let's run the mysql-example we just made:

$ docker run -dit -p 3306:3306 mysql-example

Check that it's running:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
3f0ba58084c9        mysql-example       "docker-entrypoint.s…"   About a minute ago   Up About a minute           0.0.0.0:3306->3306/tcp   romantic_swanson
picatz commented 6 years ago

Listening Ipv6

Checking what happens once the machine is running, I see docker is listening via ipv6:

Example

The command to reproduce the "issue":

$ netstat -plnt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      14969/sshd          
tcp6       0      0 :::3306                 :::*                    LISTEN      11348/docker-proxy  
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      14969/sshd  

So, we want to focus on this line:

tcp6 ... LISTEN ... 11348/docker-proxy  

Impact

I dunno yet.

picatz commented 6 years ago

Fixed with https://github.com/picatz/goldengirl/pull/24