105 lines
No EOL
2.9 KiB
Markdown
105 lines
No EOL
2.9 KiB
Markdown
---
|
||
website: https://www.docker.com/
|
||
obj: application
|
||
---
|
||
|
||
#refactor
|
||
---
|
||
Notes:
|
||
- Docker (CLI)
|
||
- Dockerfile
|
||
- Docker Swarm
|
||
---
|
||
|
||
# Docker
|
||
[Docker](https://www.docker.com/) is a utility to pack, ship and run any application as a lightweight container. Another container engine is [Podman](Podman.md)
|
||
|
||
## Dockerfile
|
||
Every container can be build from a `Dockerfile`.
|
||
|
||
### Example
|
||
A sample `Dockerfile`:
|
||
```dockerfile
|
||
FROM node:12-alpine
|
||
RUN apk add --no-cache python2 g++ make
|
||
WORKDIR /app
|
||
COPY . .
|
||
RUN yarn install --production
|
||
CMD ["node", "src/index.js"]
|
||
EXPOSE 3000
|
||
```
|
||
|
||
`FROM` defines the base image the container builds upon.
|
||
`RUN` runs a specific command.
|
||
`WORKDIR` changes working directory.
|
||
`COPY` copies files into the container image.
|
||
`CMD` is run when the container starts.
|
||
`EXPOSE` exposes a port to the network.
|
||
`ENV` sets environment variables
|
||
`ENTRYPOINT` specifies the executable that will run when the container starts
|
||
`ARG` defines build-time variables that can be passed to the `docker build` command with the `--build-arg` flag
|
||
|
||
To build a `Dockerfile`:
|
||
```shell
|
||
docker build -t getting-started .
|
||
```
|
||
|
||
## Docker Compose
|
||
[Docker Compose](https://docs.docker.com/compose/) is an alternate CLI frontend for the Docker Engine, which specifies properties of containers using a `docker-compose.yml` YAML file rather than, for example, a script with `docker run` options. This is useful for setting up reoccuring services that are use often and/or have complex configurations.
|
||
|
||
### Example
|
||
```yaml
|
||
version: "3.7"
|
||
|
||
services:
|
||
app:
|
||
build: ./app
|
||
ports:
|
||
- 3000:3000
|
||
volumes:
|
||
- ./:/app
|
||
environment:
|
||
MYSQL_HOST: mysql
|
||
MYSQL_USER: root
|
||
MYSQL_PASSWORD: secret
|
||
MYSQL_DB: todos
|
||
|
||
mysql:
|
||
image: mysql:5.7
|
||
volumes:
|
||
- todo-mysql-data:/var/lib/mysql
|
||
environment:
|
||
MYSQL_ROOT_PASSWORD: secret
|
||
MYSQL_DATABASE: todos
|
||
```
|
||
|
||
Every container is defined within the `services`.
|
||
Ports Forwards and Volumes are defined in their respective `ports` and `volumes`.
|
||
Everything inside `environment` is passed as a environment variable.
|
||
Containers can use a prebuild image (`image: image:tag`) or build one from scratch (`build: ./dir`)
|
||
|
||
### Usage
|
||
```shell
|
||
docker-compose -f docker-compose.yml up # Start services
|
||
docker-compose -f docker-compose.yml down # Stop services
|
||
docker-compose -f docker-compose.yml build # Rebuild services
|
||
docker-compose -f docker-compose.yml pull # Pull images
|
||
```
|
||
|
||
## Docker Swarm
|
||
Current versions of Docker include _swarm mode_ for natively managing a cluster of Docker Engines called a _swarm_. Use the Docker CLI to create a swarm, deploy application services to a swarm, and manage swarm behavior.
|
||
|
||
### Usage
|
||
```shell
|
||
# Create a swarm
|
||
docker swarm init --advertise-addr <MANAGER-IP>
|
||
|
||
# Get a join command on manager
|
||
docker swarm join-token worker
|
||
|
||
# Join a swarm
|
||
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
|
||
|
||
# View node info
|
||
docker node ls
|
||
``` |