7,540
edits
Changes
Docker
,no edit summary
[[Docker basic]]
[[Docker Swarm Mode]]
<br>
=Docker on Fedora 31=Install softwares==https://www.reddit.com/r/linuxquestions/comments/dn2psl/upgraded_to_fedora_31_docker_will_not_work/<br>https://fedoraproject.org/wiki/Changes/CGroupsV2<brA Fedora31-ben bevezették a CGroupsV2-t amit a docker még nem követett le, ezért a docker a CGroupsV2-vel nem fog működni, ki kell kapcsolni.
1-
<pre>
</pre>
<br>
===List/InspectSwarm classic===Whit the '''ls''' subcommand we can list all the docker-machine managed hosts. <pre># docker-machine lsNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSmanager - kvm Running tcp://192.168.42.118:2376 v18.05.0-ce </pre>* NAME: name of the created machine* ACTIVE: from the Docker client point of view, the active virtual host can be managed with the docker and with the docker-compose commands form the local host, as we would executed these commands on the remote virtual host. There can be always a single active machine that is marked with an asterisk '*' in the ls output. * DRIVER: * STATE:* URL: The IP address of the virtual host. * SWARM: With the '''inspect <machine name>''' subcommand we can get very detailed information about a specific machine: <pre># docker-machine inspect manager{ "ConfigVersion": 3, "Driver": { "IPAddress": "", "MachineName": "manager", "SSHUser": "docker", "SSHPort": 22, "SSHKeyPath": "", "StorePath": "/root/.docker/machine", "SwarmMaster": false, "SwarmHost": "tcp://0.0.0.0:3376", "SwarmDiscovery": "", "Memory": 1024, "DiskSize": 20000, "CPU": 1, "Network": "docker-network", "PrivateNetwork": "docker-machines", "ISO": "/root/.docker/machine/machines/manager/boot2docker.iso", ... }, "DriverName": "kvm", "HostOptions": { ... ... "Name": "manager"} </pre> <br> ===Set Active machine===With our local docker client we can connect Prior to the docker daemon of any of the virtual hosts. That virtual host that we can managed locally is called "active" host. From Docker client point of view, the active virtual host can be managed with the '''docker''' and with the '''docker-compose''' commands form the local host, as we executed these commands on the (remote) virtual host. We can make any docker-machine managed virtual host active with the ''''docker-machine env <machine name>'''' command. Docker gets connection information fromenvironment variables. With this command we can redirect our docker CLI. Run this command in the host. <pre># docker-machine env managerexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.42.118:2376"export DOCKER_CERT_PATH="/root/.docker/machine/machines/manager"export DOCKER_MACHINE_NAME="manager"# Run this command to configure your shell: # eval $12 Swarm (docker-machine env managerClassic)</pre> As the output of the env command suggests, you have to run the '''eval''' command in that shell that you want to use to managed the active virtual host. <pre># eval $(docker-machine env manager)</pre> Now, in the same shell, run the '''ls''' command again. The machine 'manager' will be marked with the asterisk in the ACTIVE column. <pre># docker-machine lsNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSmanager * kvm Running tcp://192.168.42.118:2376 v18.05.0-ce </pre> In the same shell on the host machine, create existed as a docker container: <pre># docker run -d -i -t --name container1 ubuntu /bin/bash9dfda56f7739831b0d19c8acd95748b1c93f6c6bb82d2aa87cfb10ecee0e4f28</pre> Now we will log on to the virtual host with the '''ssh <machine name>''' command. <pre># docker-machine ssh manager ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ ||_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|Boot2Docker version 18.05.0-ce, build HEAD : b5d6989 - Thu May 10 16:35:28 UTC 2018Docker version 18.05.0-ce, build f150324docker@manager:~$</pre> List the available docker containers. We should see there the newly created '''container1'''. The '''docker run''' command was executed in the host, bat was run in the remote, virtual host. <pre>docker@manager:~$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9dfda56f7739 ubuntu "/bin/bash" 5 minutes ago Up 5 minutes container2</pre> Running the '''docker ps''' command on the host, should give the same result. <br> ===Unset active machine=== The active machine can be unset with the "'''--unset'''" switch. Once the active docker machine was unset, the docker client will manage the local docker daemon again. <pre># docker-machine env --unsetunset DOCKER_TLS_VERIFYunset DOCKER_HOSTunset DOCKER_CERT_PATHunset DOCKER_MACHINE_NAME# Run this command to configure your shell: # eval $(docker-machine env --unset)</pre> As the output suggest, we have to run the eval command again with the '''--unset''' switch to clear the shell. Alternatively you can just start a new shell. <pre># eval $(docker-machine env --unset)</pre> Now lets run the '''ps''' command again. As the docker client now connected to the local docker daemon, we shouldn't see '''container1''' anymore in the list. <pre># docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES66e9cfbbc947 busybox "sh" 30 hours ago Up 4 minutes critcon</pre> <br><br><br>=Services= ==Introduction==In a distributed application, different pieces of the app are called “services.” Services are really just “containers in production.” A service only runs '''one''' '''image'''standalone product, but it codifies the way that image runs—what ports it should use, '''how many replicas''' of the container should run so the service has the capacity it needs, and so relied on. Scaling a service changes the number of container instances running that piece complicated setup of software, assigning more computing resources to the external service in the process. Luckily it’s very easy to define, run, and scale services with the Docker platform -- just write a docker-compose.yml file. Source: https://docs.docker.com/get-started/part3/#prerequisites ==YAMEL==YAML /'jæm.ḷ/ is a human-readable data serialization language. It is commonly used for configuration files, but could be used in many applications where data is being stored discovery systems (e.g. debugging outputeg consul) or transmitted (e.g. document headers). YAML targets many of the same communications applications as XML but has a minimal syntax which intentionally breaks compatibility with SGML [1]. It uses both Python-style indentation to indicate nesting, and a more compact format that uses [] for lists and {} for maps making YAML 1.2 a superset dedicated set of JSONcontainers which ran as the swarm controllers. Custom data types are allowed, but YAML natively encodes scalars (such as strings, integersLoad balancing network traffic across containers required external load balancers, and floats), lists, and associative arrays (also known as hashes, maps, or dictionaries). =Docker Composition= ==Introduction==Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file these needed to configure your application’s services. Then, be integrated with a single command, you build, create containers and start all the services from your configuration with a single command. '''Multiple isolated environments on a single host'''<br>Compose uses a project name service discovery to isolate environments from each otherfunction correctly. You can make use Standalone Docker hosts were members of this project name in several different contexts:* on a dev hostswarm cluster, to create multiple copies of a single environment, such as when you want to run a stable copy for each feature branch of a project* on a CI server, to keep builds from interfering with each other, you can set and the project name to a unique build number '''Development environments'''<br>When you’re developing software, swarm controllers presented the ability to run an application in an isolated environment and interact with it is crucial. The Compose command line tool can be used to create the environment and interact with it.* The Compose file provides a way to document and configure pooled capacity from all of the application’s service dependencies (databases, queues, caches, web service APIs, etc). Using the Compose command line tool you can create and start one or more containers for each dependency with hosts as a single command (“virtual” docker-compose up).* Together, these features provide a convenient way for developers to get started on a project. Compose can reduce a multi-page “developer getting started guide” to a single machine readable Compose file and a few commands. '''Automated testing environments'''<br>An important part of any Continuous Deployment or Continuous Integration process is the automated test suite. Automated end-to-end testing requires an environment in which to run tests. Compose provides a convenient way to create and destroy isolated testing environments for your test suitehost. By defining presenting the full environment in swarm cluster as a Compose file, you can create and destroy these environments in just a few commands: Source: https://docs.virtual docker.com/compose/overview/ ==docker compose vs docker stack (swarm)==In recent releases, a few things have happened in host meant that the Docker world. way you interacted with Swarm mode got integrated into the Docker Engine in 1.12, and has brought with it several new tools. Among others, it’s possible to make use of docker-compose.yml files to bring up stacks of Docker containers, without having to install Docker Compose. The command is called docker stack, and it looks was exactly the same to docker-compose.Both docker-compose and the new docker stack commands can be used with docker-compose.yml files which are written according to the specification of version 3. For your version 2 reliant projects, you’ll have to continue using docker-compose. If way you want to upgrade, it’s not a lot of work though. As docker stack does everything docker compose does, it’s a safe bet that docker stack will prevail. This means that docker-compose will probably be deprecated and won’t be supported eventually. However, switching your workflows to using docker stack is neither hard nor much overhead for most users. You can do it while upgrading your docker compose files from version 2 to 3 interacted with comparably low effort. If you’re new to the Docker world, or are choosing the technology to use for a new project - by all means, stick to using docker stack deploy. Source: https://vsupalov.com/difference-docker-compose-and-docker-stack/ ==Install==docker-compose is not part of the standard docker installation. We have to install it form github. <pre>sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$standalone host (uname -m) -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose</pre> <pre># docker-compose --versiondocker-compose version 1.21.2run, build a133471</pre> <br> ==How to use docker-compose== I will demonstrate the potential in docker-compose through a simple example. We are going to build a WordPress service that requires two containers. On for the mysql database and one for the WordPress itself. To make the example a little bit more complicatedps, we won't simple download the WordPress image from DockerHub, we are going to build it, using the wordPress image as the base image of our newly built image. So with a simple docker-compose.yml file we can build as many images as we want and we can construct containers from them in the given order. Isn't it huge? <pre>$ mkdir wp-example$ cd wp-example$ mkdir wordpress$ touch docker-compose.yml</pre> <pre>[wp-example]# lltotal 8-rw-r--r-- 1 root root 148 Jun 23 23:09 docker-compose.ymldrwxr-xr-x 2 root root 4096 Jun 23 22:58 wordpress</pre> <pre>$ cd wordpress$ touch Dockerfile$ touch example.html</pre> <pre>[wordpress]# lltotal 8-rw-r--r-- 1 root root 159 Jun 23 22:58 Dockerfile-rw-r--r-- 1 root root 18 Jun 23 22:44 example.html</pre> <syntaxhighlight lang="Python">FROM wordpress:latestCOPY ["./example.html","/var/www/html/example.html"]VOLUME /var/www/htmlENTRYPOINT ["docker-entrypoint.sh"]CMD ["apache2-foreground"]</syntaxhighlight> docker-compose.yml <syntaxhighlight lang="C++">version: '3'services: wordpress: container_name: my-worldrpress-container image: myWordPress:6.0 build: ./wordpress links: - db:mysql ports: - 8080:80 db: image: mariadb environment: MYSQL_ROOT_PASSWORD: example</syntaxhighlight>{{note|You can use only space to make indention. Tab is not supported }} <pre>[wp-example]# docker-compose up -dBuilding wordpressStep 1/5 : FROM wordpress:latest ---> 7801d36d734cStep 2/5 : COPY ./example.html /var/www/html/example.html ---> ab67aee3c270Removing intermediate container a0894a2e834fStep 3/5 : VOLUME /var/www/html ---> Running in 470025d9c877 ---> 9890d3cd9f0aRemoving intermediate container 470025d9c877Step 4/5 : ENTRYPOINT docker-entrypoint.sh ---> Running in 09548484b9b2 ---> 555754d6a3a7Removing intermediate container 09548484b9b2Step 5/5 : CMD apache2-foreground ---> Running in 035fcfc0876d ---> 076e75c72b58Removing intermediate container 035fcfc0876dSuccessfully built 076e75c72b58Successfully tagged wp2-example_wordpress:latestWARNING: Image for service wordpress was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.Creating wp2-example_db_1 ... doneCreating wp2-example_wordpress_1 ... doneAttaching to wp2-example_db_1, wp2-example_wordpress_1</pre> <pre>[wp-example]# docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------wp2-example_db_1 docker-entrypoint.sh mysqld Up 3306/tcp wp2-example_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp</pre> <pre># docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8ec2920234b6 wp2-example_wordpress "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:8080->80/tcp wp2-example_wordpress_1786fb7da1ca7 mariadb "docker-entrypoint..." About a minute ago Up About a minute 3306/tcp wp2-example_db_1</pre> <br> ==docker-compose.yml syntax== There are three major versions of compose file format. ===compose only=== * '''build''': Configuration options that are applied at build time** The object form is allowed in Version 2 and up.** In version 1, using build together with image is not allowed. Attempting to do so results in an error.** From version 3volumes), if you specify image as well as build, then Compose names just directed the built image with the webapp and optional tag specified in image** Note: This option is ignored when deploying a stack in swarm mode with a commands (version 3) Compose file. The docker stack command accepts only pre-built images.*** '''dockerfile''': Dockerfile-alternate*** '''CONTEXT''': Either a path to a directory containing a Dockerfile, or a url to a git repository.*** '''TARGET''': Build the specified stage as defined inside the Dockerfile (added in 3.4)<pre>version: '3'services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate target: prod</pre> * '''container_name''': define the name of the container that is created for the service. {{note|* If the build and the image is both provided, the image will be created with the name given in the image parameter. * If the image tag is not provided, the default name of the new image isusing –H=tcp: </directory name>_<service_name>* If the container_name is not provided, the container default name is: </directory name>_<service_name> }} * '''container_name''': Specify a custom container name, rather than a generated default name * '''external_links''': Link to containers started outside this docker-compose.yml or even outside of Compose, especially for containers that provide shared or common services. external_links follow semantics similar to links when specifying both the container name and the link alias (CONTAINER:ALIAS).<pre>external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql</pre> * '''network_mode''': Network mode. Use the same values as the docker client --network parameter, plus at the special form service:[service name].<pre>network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"</pre> <hr>=== swarm only===<br> * '''deploy''': This only takes effect when deploying to a swarm with docker stack deploy, and is ignored by docker-compose up and docker-compose run.** '''ENDPOINT_MODE''': *** vip: (default): Single Virtual master IP for the service. Swarm is load balancing *** dnsrr: (DNS round rubin): DNS query gives the list Port instead of the individual swarm nodes for our own load balancing. ** '''MODE''': Either global (exactly one container per swarm node) or replicated (a specified number of containers)** '''PLACEMENT''': ** '''REPLICAS''': If the service is replicated (which is the default), specify the number of containers that should be running at any given time.** '''RESOURCES'''** '''RESTART_POLICY''':<pre>version: '3'services: redis: image: redis:alpine deploy: replicas: 6 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s</pre> <br><br>