Containerized Software: Docker

Andere delen in de serie:

Docker heeft twee hoofdcomponenten:

  • Docker: het open source platform voor containervirtualisatie.
  • Docker Hub: Software-as-a-Service-platform voor het delen en beheren van Docker-containers.

Docker gebruikt een client-server-architectuur. De Docker-client praat met de Docker-daemon, die het zware werk doet bij het bouwen, draaien en distribueren van Docker-containers. Zowel de Docker-client als de daemon kunnen op hetzelfde systeem draaien, of we kunnen een Docker-client verbinden met een externe Docker-daemon. De Docker-client en daemon communiceren via sockets of via een RESTful API.

De Docker-daemon draait op een host. De gebruiker heeft geen directe interactie met de daemon, maar in plaats daarvan via de Docker-client. De Docker-client, in de vorm van het binaire docker-bestand, is de primaire gebruikersinterface voor Docker. Het accepteert commando’s van de gebruiker en communiceert heen en weer met een Docker-daemon.

Een Docker-image is een read-only template. Een image kan bijvoorbeeld een Centos-besturingssysteem bevatten met Apache en onze webapplicatie geïnstalleerd. Images worden gebruikt om Docker-containers te maken. Docker biedt een eenvoudige manier om nieuwe images te bouwen of bestaande images bij te werken, of we kunnen Docker-images downloaden die andere al hebben gemaakt. Docker-images zijn de build-component van Docker.

Docker-containers zijn vergelijkbaar met een directory. Een Docker-container bevat alles wat nodig is om een ​​applicatie uit te voeren. Elke container wordt gemaakt op basis van een Docker-image. Docker-containers kunnen worden uitgevoerd, gestart, gestopt, verplaatst en verwijderd. Elke container is een geïsoleerd en veilig applicatieplatform. Docker-containers zijn de run-component van Docker.

Docker-registry bevatten images. Dit zijn openbare of privé-stores waarvan we images uploaden of downloaden. De openbare Docker-registry wordt geleverd door Docker Hub. Het biedt een verzameling bestaande images voor gebruik. Docker-registry is het distributiecomponent van Docker.

Hieronder hebben we de volgende omgeving (hosts) opgezet:

  • docker.machine.com – draait een Docker-daemon, een lokaal private registry, en zal worden gebruikt om images te bouwen en te testen. Als directory-structuur zullen we het volgende gebruiken
/opt
    /docker
        /certs (contains the certificates for client-server communication)
            /ca
                ca-key.pem
                ca.pem
                ca.srl
            /client
                cert.pem
                key.pem
            /server
                server-cert.pem
                server-key.pem
        /custom-containers
            /centos-systemd
                Dockerfile
            /httpd
                Dockerfile
                mod_proxy.conf
            /springboot-example
                Dockerfile
                /jars
                jdk-8u45-linux-x64.tar.gz
    /docker-compose
        /registry
            docker-compose.yml
    /registry
        /auth
            htpasswd
        /certs (contains the certificates to communicate with the local private registry)
            registry.crt
            registry.key
        /configuration
            config.yml
        /data
            /docker/registry/v2 (generated by Docker when images are pushed to the registry)
                /blobs
                /registries
  • springboot1.machine.com – draait een Docker Daemon, een Apache HTTP Server Docker-container en een Spring Boot Docker-container.
  • springboot2.machine.com – draait een Docker Daemon en een Spring Boot Docker-container.

Installatie

Om Docker te installeren, kunnen we het volgende gebruiken:

[root@docker ~]# curl -sSL https://get.docker.com/ | sh

Het installatieprogramma maakt een yum repo aan

[root@docker ~]# cat /etc/yum.repos.d/docker-main.repo
[docker-main-repo]
name=Docker main Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

en voert yum -y -q install docker-engine uit. Het installatieprogramma maakt ook de nodige bestanden om Docker als een daemon te laten draaien:

  • Linux 6: /etc/rc.d/init.d/docker, en het configuratiebestand /etc/sysconfig/docker.
  • Linux 7: /usr/lib/systemd/system/docker.service, en /usr/lib/systemd/system/docker.socket.

Merk op dat wanneer Docker voor de eerste keer wordt uitgevoerd, het een ‘netwerkbrug’ zal opzetten (meestal docker0 genoemd). Wanneer containers worden gemaakt (en uitgevoerd), wordt een IP-adres toegewezen aan de container op het netwerk van de bridge en wordt het verkeer via deze bridge naar de container geleid. Meer informatie is te vinden in het artikel over netwerkconfiguratie. Terwijl de Docker-daemon draait, kunnen we onze lokale private registry opzetten.

Registry

Om een lokaal private registry op te zetten, hebben we eerst enkele basisimages nodig. Deze kunnen helemaal opnieuw worden gemaakt met behulp van scripts, of zoals in ons geval, gaan we ze uit de openbare Docker-registry halen

[root@docker ~]# docker search centos

[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
f1b10cd84249: Pull complete
c852f6d61e65: Pull complete
7322fbe74aa5: Pull complete
Digest: sha256:90305c9112250c7e3746425477f1c4ef112b03b4abe78c612e092037bfecc3b7
Status: Downloaded newer image for centos:latest

[root@docker ~]# docker images

Vervolgens gaan we het lokale private registry opzetten. Eerst gaan we de benodigde certificaten aanmaken (best practices voor het maken van certificaten worden beschreven in het document SSL / TLS Deployment Best Practices).

# create the necessary directories
[root@docker ~]# mkdir -p /opt/registry/{data,certs,auth}
 
# generate self signed certificates (be sure that the domain-name resolves to a valid ip, for example, by adding it to /etc/hosts)
# req - PKCS#10 certificate request and certificate generating utility.
# -new: this option generates a new certificate request. It will prompt the user for the relevant field values.
# -x509: this option outputs a self signed certificate instead of a certificate request.
# -days n: when the -x509 option is being used this specifies the number of days to certify the certificate for.
# -[digest]: this specifies the message digest to sign the request with (run 'openssl dgst -h output' to see a list of possible values).
# -newkey arg: this option creates a new certificate request and a new private key. The argument takes one of several forms. rsa:nbits, where nbits is the number of bits, generates an RSA key nbits in size.
# -nodes: if this option is specified then if a private key is created it will not be encrypted.
# -keyout filename: this gives the filename to write the newly created private key to. 
# -out filename: This specifies the output filename to write to or standard output by default.
# -subj arg: sets subject name for new request or supersedes the subject name when processing a request. The arg must be formatted as /type0=value0/type1=value1/type2=...
 
[root@docker ~]# openssl req -new -x509 -days 365 -sha256 -newkey rsa:2048 -nodes -keyout /opt/registry/certs/registry.key -out /opt/registry/certs/registry.crt -subj '/C=NL/ST=Middleware/L=Snippets/O=Middleware Snippets/OU=Blogging/CN=docker.machine.com'
Generating a 2048 bit RSA private key
...................................................................................................+++
..........................................................................+++
writing new private key to '/opt/registry/certs/registry.key'
-----
 
# change the permission of the generated files
[root@docker certs]# chmod 0400 registry.key
[root@docker certs]# chmod 0444 registry.crt
[root@docker certs]# ll
-r--r--r-- 1 root root 1399 Aug 19 09:57 registry.crt
-r-------- 1 root root 1704 Aug 19 09:57 registry.key
 
# copy the certificate to /etc/docker/certs.d/<REGISTRY_HOST>:<REGISTRY_PORT>/ca.crt (in which REGISTRY_HOST=docker.machine.com and REGISTRY_PORT=5000)
[root@docker ~]# mkdir -p /etc/docker/certs.d/docker.machine.com\:5000
[root@docker ~]# cp /opt/registry/certs/registry.crt /etc/docker/certs.d/docker.machine.com\:5000/ca.crt
 
# also copy the certifcate to the other hosts
[root@docker certs]# scp registry.crt root@springboot1.machine.com:/etc/docker/certs.d/docker.machine.com\:5000/ca.crt
root@springboot1.machine.com's password:
registry.crt                                                                                                                                                   100% 1399     1.4KB/s   00:00
[root@docker certs]# scp registry.crt root@springboot2.machine.com:/etc/docker/certs.d/docker.machine.com\:5000/ca.crt
root@springboot2.machine.com's password:
registry.crt                                                                                                                                                   100% 1399     1.4KB/s   00:00
 
# restart the docker daemon
[root@docker ~]# systemctl stop docker
[root@docker ~]# systemctl start docker
 
# generate a password file for authentication (when run for the first time the registry:2 image will be pulled from the Docker Hub)
[root@docker ~]# docker run --entrypoint htpasswd registry:2 -Bbn docker snippets12c > /opt/registry/auth/htpasswd
Unable to find image 'registry:2' locally
2: Pulling from library/registry
...
2f1ef7702586: Pull complete
2f1ef7702586: Already exists
library/registry:2: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:51303fea21187466ee786ee6291fc15967ff9a24c9943154a64a82a63ddf3594
Status: Downloaded newer image for registry:2
 
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry            2                   2f1ef7702586        4 days ago          220.6 MB
centos              latest              7322fbe74aa5        8 weeks ago         172.2 MB

Vervolgens gaan we het registry maken met Docker Compose (installatiestappen)

# install docker compose
[root@docker ~]# curl -L https://github.com/docker/compose/releases/download/1.4.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   401    0   401    0     0    504      0 --:--:-- --:--:-- --:--:--   503
100 7994k  100 7994k    0     0  1325k      0  0:00:06  0:00:06 --:--:-- 1711k
 
# make the binary executable
[root@docker ~]# chmod +x /usr/local/bin/docker-compose
 
# create a docker compose file
[root@docker ~]# mkdir -p /opt/docker-compose/registry
[root@docker ~]# touch /opt/docker-compose/registry/docker-compose.yml
 
# add the following contents to the docker-compose.yml file
registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt
    REGISTRY_HTTP_TLS_KEY: /certs/registry.key
    REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry
    #REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    #REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
  volumes:
    - /opt/registry/data:/var/lib/registry
    - /opt/registry/certs:/certs
    - /opt/registry/auth:/auth
    
# start the registry
[root@docker ~]# cd /opt/docker-compose/registry/
[root@docker registry]# docker-compose up -d
Creating registry_registry_1...
 
# check the running containers
[root@docker registry]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c14fd99115d8        registry:2          "/bin/registry /etc/d"   5 seconds ago       Up 4 seconds        0.0.0.0:5000->5000/tcp   registry_registry_1

Merk op dat het gebruik van Docker Compose optioneel is, we hadden ook het volgende kunnen gebruiken

    [root@docker ~]# docker run -d --name=registry --restart=always -p 5000:5000 -v /opt/registry/data:/var/lib/registry -v /opt/registry/certs:/certs -v /opt/registry/auth:/auth -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry registry:2

Hierboven hebben we de parameters HTTP_TLS_CERTIFICATE, HTTP_TLS_KEY en STORAGE_FILESYSTEM_ROOTDIRECTORY geconfigureerd voor de registry. Merk op dat we de parameters ook kunnen toevoegen aan een configuratiebestand (config.yml), bijvoorbeeld

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    layerinfo: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  tls:
    certificate: /certs/registry.crt
    key: /certs/registry.key
#auth:
#  htpasswd:
#    realm: basic-realm
#    path: /auth/htpasswd

wat kan worden gebruikt om een extra volume toe te voegen aan de opdracht run (en de omgevingsvariabelen weg te laten)

[root@docker ~]# docker run -d --name registry --restart=always -p 5000:5000 -v /opt/registry/data:/var/lib/registry -v /opt/registry/certs:/certs -v /opt/registry/auth:/auth -v /opt/registry/configuration/config.yml:/etc/docker/registry/config.yml registry:2

Nu kunnen we ook eenvoudig toegangsbeperking in- en uitschakelen. Om toegangsbeperking in te schakelen, verwijderen we het commentaar in de sectie auth (AUTH_HTPASSWD_REALM en AUTH_HTPASSWD_PATH) in het bestand config.yml en starten we de registry opnieuw.

# restart the registry
[root@docker ~]# docker stop registry
registry
[root@docker ~]# docker start registry
registry
 
# try to pull something from the registry
[root@docker ~]# docker --tlsverify -H=springboot2.machine.com:2376 pull docker.machine.com:5000/springbootexample:latest
Pulling repository docker.machine.com:5000/springbootexample
Error: image springbootexample:latest not found
 
# login
[root@docker ~]# docker login docker.machine.com:5000
Username: docker
Password:
Email: docker@somewhere.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
 
# now we are able to pull something from the registry again
[root@docker ~]# docker --tlsverify -H=springboot2.machine.com:2376 pull docker.machine.com:5000/springbootexample:latest
latest: Pulling from springbootexample
f1b10cd84249: Already exists
c852f6d61e65: Already exists
7322fbe74aa5: Already exists
4cfba0adf483: Already exists
6a5b64d0925e: Already exists
e136fb7fd983: Already exists
f027b1b29898: Already exists
e8261eb40ec4: Already exists
20ee6480f62e: Already exists
369ff136c2b5: Already exists
c200531e0027: Already exists
012ae7d5f8b5: Already exists
c8a563965cf0: Already exists
Digest: sha256:0b50559aa6d94d3a6919c5efd77b2ce262760c1bc4a9db7cb0b4f539ee854e0e
Status: Image is up to date for docker.machine.com:5000/springbootexample:latest

Om images aan het private registry toe te voegen, kunnen we het volgende gebruiken

# tag the pulled centos images
[root@docker ~]# docker tag centos docker.machine.com:5000/centos
[root@docker ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry                         2                   2f1ef7702586        5 days ago          220.6 MB
docker.machine.com:5000/centos   latest              7322fbe74aa5        8 weeks ago         172.2 MB
centos                           latest              7322fbe74aa5        8 weeks ago         172.2 MB
 
# push the tagged image to the local registry
[root@docker ~]# docker push docker.machine.com:5000/centos
The push refers to a repository [docker.machine.com:5000/centos] (len: 1)
7322fbe74aa5: Image successfully pushed
c852f6d61e65: Image successfully pushed
f1b10cd84249: Image already exists
latest: digest: sha256:c33c8c535e858b7d91074b01d85db9503dd47d906f1196759bea95efa5f4d88d size: 5126
 
# remove the images
[root@docker ~]# docker rmi docker.machine.com:5000/centos
Untagged: docker.machine.com:5000/centos:latest
[root@docker ~]# docker rmi centos
Untagged: centos:latest
Deleted: 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
Deleted: c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
Deleted: f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry            2                   2f1ef7702586        4 days ago          220.6 MB
 
# pull the centos image from the local registry
[root@docker ~]# docker pull docker.machine.com:5000/centos
Using default tag: latest
latest: Pulling from centos
f1b10cd84249: Pull complete
c852f6d61e65: Pull complete
7322fbe74aa5: Pull complete
Digest: sha256:c33c8c535e858b7d91074b01d85db9503dd47d906f1196759bea95efa5f4d88d
Status: Downloaded newer image for docker.machine.com:5000/centos:latest
[root@docker ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry                         2                   2f1ef7702586        5 days ago          220.6 MB
docker.machine.com:5000/centos   latest              7322fbe74aa5        8 weeks ago         172.2 MB

Images en containers maken

Docker kan automatisch images bouwen door de instructies van een Dockerfile te lezen. Een Dockerfile is een tekstdocument dat alle opdrachten bevat die we normaal gesproken handmatig zouden uitvoeren om een Docker-image te bouwen. Door docker build aan te roepen vanaf de terminal, kunnen we Docker de image stap voor stap laten bouwen en de instructies achtereenvolgens uitvoeren. Best practices voor het schrijven van Dockerfiles zijn hier te vinden.

# create the directory structure
[root@docker ~]# mkdir -p /opt/docker/custom-containers/springboot-example
[root@docker springboot-example]# mkdir jars
 
# copy the necessary files to the springboot-example directory
[root@docker springboot-example]# ll
total 169080
-rw-r--r-- 1 root root       847 Aug 18 19:56 Dockerfile
drwxr-xr-x 2 root root      4096 Aug 18 19:53 jars
-rw-r--r-- 1 root root 173129476 Aug 18 19:53 jdk-8u45-linux-x64.tar.gz
 
# create the Dockerfile
[root@docker springboot-example]# cat Dockerfile
FROM docker.machine.com:5000/centos
 
ENV ROOT_DIR /u01/springboot
ENV MODULE_DIR ${ROOT_DIR}/jars
ENV JAVA_HOME ${ROOT_DIR}/jdk8
ENV PATH ${PATH}:${JAVA_HOME}/bin
 
RUN /usr/bin/mkdir -p ${MODULE_DIR}
 
COPY jars ${MODULE_DIR}
 
ADD jdk-8u45-linux-x64.tar.gz ${ROOT_DIR}
 
#RUN /usr/bin/mkdir -p ${JAVA_HOME}
 
#RUN /usr/bin/tar xzf ${ROOT_DIR}/jdk-8u45-linux-x64.tar.gz -C ${JAVA_HOME}
 
RUN /usr/bin/sed -i -e '/securerandom/ s;file:/dev/urandom;file:/dev/./urandom;' \
 -e '/securerandom/ s;file:/dev/random;file:/dev/./urandom;' ${JAVA_HOME}/jre/lib/security/java.security
 
EXPOSE 8080 9090
 
CMD ["java", "-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder", "-Dcom.sun.management.jmxremote.port=9090", "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-jar", "/u01/springboot/jars/springboot.jar"]

De Dockerfile heeft de volgende instructies:

  • De FROM-instructie stelt de basistoewijzing in voor volgende instructies. In dit geval gebruiken we centos als basisimage.
  • De ENV-instructie stelt een omgevingsvariabele ${KEY} in op een waarde. Deze waarde bevindt zich in de omgeving van alle ‘afstammende’ Dockerfile-opdrachten. Om nieuwe software gemakkelijker te laten draaien, kunnen we ENV gebruiken om de PATH-omgevingsvariabele bij te werken.
  • De RUN-instructie voert alle opdrachten uit in een nieuwe laag bovenop de huidige image en legt de resultaten vast. De resulterende vastgelegde image zal worden gebruikt voor de volgende stap in de Dockerfile. Het in lagen aanbrengen van RUN-instructies en het genereren van commits komt overeen met de kernconcepten van Docker, waar commits goedkoop zijn en containers kunnen worden gemaakt vanaf elk punt in de geschiedenis van een image.
  • De COPY-instructie kopieert nieuwe bestanden of mappen van ${SOURCE} en voegt ze toe aan het bestandssysteem van de container op het ${DESTINATION}-pad.
  • Over het algemeen zijn ADD en COPY functioneel vergelijkbaar. Merk op dat COPY alleen het standaard kopiëren van lokale bestanden naar de container ondersteunt, terwijl ADD extra functies heeft, zoals tar-extractie, dus de ADD-instructie hierboven extraheert automatisch het JDK-tar-bestand in de ${ROOT_DIR}.
  • De EXPOSE-instructies informeren Docker dat de container tijdens runtime naar de opgegeven netwerkpoorten luistert wanneer de vlag -P wordt gebruikt.
  • Er kan slechts één CMD-instructie in een Dockerfile zijn. Als er meer dan één CMD-instructie wordt geluisterd, wordt alleen de laatste CMD-instructie van kracht. Het belangrijkste doel van een CMD-instructie is om standaardinstellingen te bieden voor een uitvoerende container. Deze standaardinstellingen kunnen een uitvoerbaar bestand bevatten, of ze kunnen het uitvoerbare bestand weglaten, in welk geval we ook een ENTRYPOINT-instructie moeten specificeren.

Vervolgens maken we de image op basis van de Dockerfile, met behulp van docker build

[root@docker springboot-example]# docker build --rm --tag docker.machine.com:5000/springbootexample .
Sending build context to Docker daemon 188.4 MB
Step 0 : FROM docker.machine.com:5000/centos
 ---> 7322fbe74aa5
Step 1 : ENV ROOT_DIR /u01/springboot
 ---> Running in fce68f10bf69
 ---> 4cfba0adf483
Removing intermediate container fce68f10bf69
Step 2 : ENV MODULE_DIR ${ROOT_DIR}/jars
 ---> Running in da028b849534
 ---> 6a5b64d0925e
Removing intermediate container da028b849534
Step 3 : ENV JAVA_HOME ${ROOT_DIR}/jdk8
 ---> Running in e2fc8e207cc2
 ---> e136fb7fd983
Removing intermediate container e2fc8e207cc2
Step 4 : ENV PATH ${PATH}:${JAVA_HOME}/bin
 ---> Running in c3ed29f6fe60
 ---> f027b1b29898
Removing intermediate container c3ed29f6fe60
Step 5 : RUN /usr/bin/mkdir -p ${MODULE_DIR}
 ---> Running in 7f8defc2d17a
 ---> e8261eb40ec4
Removing intermediate container 7f8defc2d17a
Step 6 : COPY jars ${MODULE_DIR}
 ---> 20ee6480f62e
Removing intermediate container 14db20f0d5b0
Step 7 : ADD jdk-8u45-linux-x64.tar.gz ${ROOT_DIR}
 ---> 369ff136c2b5
Removing intermediate container 39a32e0e78f1
Step 8 : RUN /usr/bin/sed -i -e '/securerandom/ s;file:/dev/urandom;file:/dev/./urandom;'  -e '/securerandom/ s;file:/dev/random;file:/dev/./urandom;' ${JAVA_HOME}/jre/lib/security/java.security
 ---> Running in 06cf3fe2233b
 ---> c200531e0027
Removing intermediate container 06cf3fe2233b
Step 9 : EXPOSE 8080 9090
 ---> Running in f4b1aa4e9146
 ---> 012ae7d5f8b5
Removing intermediate container f4b1aa4e9146
Step 10 : CMD java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /u01/springboot/jars/springboot.jar
 ---> Running in aa01cf06a9c6
 ---> c8a563965cf0
Removing intermediate container aa01cf06a9c6
Successfully built c8a563965cf0
 
# check
[root@docker springboot-example]# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.machine.com:5000/springbootexample   latest              c8a563965cf0        36 seconds ago      528.4 MB
registry                                    2                   2f1ef7702586        5 days ago          220.6 MB
docker.machine.com:5000/centos              latest              7322fbe74aa5        8 weeks ago         172.2 MB
 
[root@docker springboot-example]# docker push docker.machine.com:5000/springbootexample:latest
The push refers to a repository [docker.machine.com:5000/springbootexample] (len: 1)
c8a563965cf0: Image successfully pushed
012ae7d5f8b5: Image successfully pushed
c200531e0027: Image successfully pushed
369ff136c2b5: Image successfully pushed
20ee6480f62e: Image successfully pushed
e8261eb40ec4: Image successfully pushed
f027b1b29898: Image successfully pushed
e136fb7fd983: Image successfully pushed
6a5b64d0925e: Image successfully pushed
4cfba0adf483: Image successfully pushed
7322fbe74aa5: Image already exists
c852f6d61e65: Image successfully pushed
f1b10cd84249: Image already exists
latest: digest: sha256:0b50559aa6d94d3a6919c5efd77b2ce262760c1bc4a9db7cb0b4f539ee854e0e size: 25785
 
# test: create and run the container
[root@springboot1 ~]# systemctl start docker
[root@springboot1 ~]# docker pull docker.machine.com:5000/springbootexample:latest
latest: Pulling from springbootexample
4cfba0adf483: Pull complete
6a5b64d0925e: Pull complete
e136fb7fd983: Pull complete
f027b1b29898: Pull complete
e8261eb40ec4: Pull complete
20ee6480f62e: Pull complete
369ff136c2b5: Pull complete
c200531e0027: Pull complete
012ae7d5f8b5: Pull complete
c8a563965cf0: Pull complete
f1b10cd84249: Already exists
c852f6d61e65: Already exists
7322fbe74aa5: Already exists
Digest: sha256:0b50559aa6d94d3a6919c5efd77b2ce262760c1bc4a9db7cb0b4f539ee854e0e
Status: Downloaded newer image for docker.machine.com:5000/springbootexample:latest
 
[root@springboot1 ~]# docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.machine.com:5000/springbootexample   latest              c8a563965cf0        21 minutes ago      528.4 MB
 
[root@springboot1 ~]# docker run -d --name="springbootexample" --net="host" -v /home/temp:/home/temp -p 8080:8080 -p 9090:9090 docker.machine.com:5000/springbootexample
7193fa0ef4c8424c634d71fea044ea3fddb0e5842f3da773ce20c29ec9f497f6
 
# check
[root@springboot1 ~]# docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
7193fa0ef4c8        docker.machine.com:5000/springbootexample   "java -XX:+UnlockComm"   22 seconds ago      Up 21 seconds                           springbootexample
 
# to check all the containers we can use
[root@springboot1 ~]# docker ps -a
CONTAINER ID        IMAGE                                       COMMAND                  CREATED              STATUS              PORTS               NAMES
7193fa0ef4c8        docker.machine.com:5000/springbootexample   "java -XX:+UnlockComm"   About a minute ago   Up About a minute                       springbootexample
 
# to stop and remove the created container we can use
[root@springboot1 ~]# docker stop springbootexample
springbootexample
[root@springboot1 ~]# docker rm springbootexample
springbootexample
 
# connect to the container
[root@springboot1 ~]# docker exec -it springbootexample /bin/bash
[root@springboot1 /]# ps -ef|grep [j]ava
root          1      0  3 09:31 ?        00:00:07 java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /u01/springboot/jars/springboot.jar
[root@springboot1 /]# jstat -gcutil 1 1 1
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 93.46   0.00  23.26  70.83  97.62  95.02     56    0.155     3    0.109    0.265

In het laatste commando hebben we jstat gebruikt om de garbagecollection te controleren.

Om de container uit te voeren, hebben we gespecificeerd om de container in detached modus uit te voeren door -d op te geven. We kunnen de container identificeren door de container een aangepaste naam te geven. Merk op dat UUID-identifiers afkomstig zijn van de Docker-daemon, en als we geen naam aan de container toekennen met --name, dan zal de daemon ook een willekeurige stringnaam genereren.

Als netwerkinstelling hebben we de host-optie gebruikt. In dit geval deelt de container de netwerkstack van de host en zijn alle interfaces van de host beschikbaar voor de container. De reden hiervoor is dat in vergelijking met de standaard bridge-modus, de host-modus aanzienlijk betere netwerkprestaties geeft, aangezien het de native netwerkstack van de host gebruikt, terwijl de bridge één virtualisatieniveau moet doorlopen via de docker-daemon. Het wordt aanbevolen om containers in deze modus uit te voeren wanneer hun netwerkprestaties kritiek zijn (wat het geval is bij webservers).

We hebben ook een volume gedefinieerd (zie meer informatie over volumes hier). De reden voor de volumedefinitie is dat het gemakkelijker wordt om bestanden (zoals gemaakte flight recordings of heap-dumps) uit de container te verkrijgen.

Ten slotte hebben we de poorten van de container open gezet. In dit geval is 8080 de standaard HTTP-luisterpoort voor de Tomcat-servletcontainer en 9090 voor JMX.

Scroll to Top