MYSQL_PASS=password
와 같이 컨테이너를 띄울 때, 환경변수를 같이 지정$ curl -s https://get.docker.com/ | sudo sh
$ cat /etc/group | grep sudo
sudo:x:27:dhyang
$ sudo usermod -aG docker [hostname]
# sudo usermod -aG docker dhyang
sudo -su USERNAME
하면 reboot 없이 바로 적용됨$ sudo docker version
Client: Docker Engine - Community # 클라이언트
Version: 20.10.6 # Local host의 도커
API version: 1.41
Go version: go1.13.15
Git commit: 370c289
Built: Fri Apr 9 22:47:17 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community # 서버
Engine: # 실제 Docker
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:45:28 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo service docker status
* Docker is not running # <- 도커 대몬 is not running
$ sudo service docker start # <- 도커 대몬 start!
* Starting Docker: docker [ OK ]
docker search ubuntu
커맨드를 실행하면, 받을 수 있는 이미지가 나온다.$ docker pull ubuntu[:20.04]
# 20.04 버전을 받으려면, :20.04 태그를 붙여서 pull 받는다.
run
- 컨테이너 실행run
: image를 컨테이너로 생성exec
: 실행 중인 컨테이너에게 접속 / 명령어 전달$ docker run [OPTIONS] IMAGE[:TAG | @DIGEST] [COMMAND] [ARG...]
run
의 optionOption | Description | 예 |
---|---|---|
-d | detaced mode(백그라운드 모드) | 나중에 컨테이너를 attach 하고 싶으면$ docker attach <NAME> |
-p | 호스트와 컨테이너의 포트를 연결 | -p 1234:80 내컴 1234 : 호스트 80 연결항상!! 내컴 : docker_host이다. |
-v | 호스트와 컨테이너의 디렉토리 연결 | -v /var/jenkins_home:/var/jenkins_home 내컴 /var/jeknins_home 을 호스트 /var/jenkins_home 으로 연결 |
-e | 컨테이너 내에서 사용할 환경변수 설정 | |
--name | 컨테이너 이름 설정 | |
--rm | 프로세스 종료시 컨테이너 자동 제거 | |
-it | -i와 -t를 동시에 사용한 것 터미널 입력을 위한 옵션 | |
--network | 네트워크 연결 | |
-u <user> | 지정한 user 로 로그인 | -u root : 도커 컨테이너 실행 시, root 로 접속-u jenkins : 도커 컨테이너 실행 시, jenkins 로 접속 |
--privileged | privileged 권한을 주고 컨테이너를 실행한다.기본적으로 컨테이너는 이 옵션을 주지 않으면 Unprivileged모드이다. | |
--restart <OPTION> | 컨테이너 재시작에 관한 설정. 자세한 설명은 아래 참고 |
privileged
-it
옵션을 주지 않고 실행ctrl+c
로 컨테이너를 종료reboot
docker start <name>
으로 재 시작한다.--restart <OPTION>
으로 줄 수 있다.<OPTION> | 설명 |
---|---|
--restart unless-stopped | 부팅시 자동으로 컨테이너를 재시작 |
--restart no | 프로세스가 종료되더라도 컨테이너를 재시작하시 않는다. |
--restart on-failure | 프로레스 exit code 가 0 이 아닐 때 재시작한다. 지정하지 않으면 계속해서 컨테이너를 재시작 한다. |
--restart always | 프로세스의 exit code 와는 관계없이 재시작 |
<service_name>.service
로 서비스 파일 를 만든다.[Unit]
Wants=docker.service
After=docker.service
[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/docker restart <container이름> # 시작
# 컨테이너 재 시작 후 시행할 명령
ExecStartPost=/usr/bin/docker exec --user <user> <container이름> bash -c "실행후 컨테이너에게 실행할 명령어; 웹서버를 켠다던가.."
# 서비스를 멈출때 실행할 명령
ExecStop=/usr/bin/docker stop <container이름>
[Install]
WantedBy=multi-user.target
$ sudo systemctl start <service_name> # 서비스 시작
$ sudo systemctl enable <service_name> # 부팅시 실행할 수 있도록 서비스 활성화
/etc/systemd/system/multi-user.target.wants/<service_name>.service -> \
/etc/systemd/system/<service_name>.service
# multi-user-target에 심볼릭 링크가 생성된다.
Creating option | Description |
---|---|
docker run -it | ctrl + p , ctrl + q |
docker run -i | ctrl + p, ctrl + q 로 빠져 나올 수 없다. stdin 을 파괴시킨다. |
docker run | ctrl + p, ctrl + q 로 빠져나올 수 없다.SIGKILL 로 컨테이너를 종료할 수 있다. |
$ docker attach <container name>
commit
/ stop
/ rm
1. 도커 우분투 컨테이너 만들고 실행
$ docker run --name git -it --rm ubuntu:latest bash
이름  ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
IMAGE : TAG
--- 도커 내부 ---
# 도커 내부에서 ctrl+p ctrl+q 누르면 종료하지 않고 도커를 나올 수 있다.
--- local ---
2. 로컬로 돌아와 커밋
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abab0aa93b82 ubuntu:latest "/bin/bash" 6 minutes ago Up 6 minutes git
실행 중인 컨테이너 이름  ̄ ̄
$ docker commit git dhyang/ubuntu:git
이름 ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄: ̄ ̄ ̄ ̄
어떤 name을 커밋할거임? IMAGE : TAG <- IMAGE:TAG 이건 새로 붙이는거임
=> 현재 사용 중인 도커 컨테이너 로컬 커밋시킴
-----------------------------------------------------------------------
=> 나중에 다시 사용 하고 싶을 때!
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dhyang/ubuntu git 039cd2eb92d7 4 minutes ago 97.7MB
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄
IMAGE TAG <-- 이름은 저장되어 있지 않음
$ docker run --name zsh -it --rm dhyang/ubuntu:git
새로운 이름 ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
run은 새로운 이름 만들어 실행할 수 있음 IMAGE : TAG (태그까지 다 붙여야함)
-v <args> | description |
---|---|
-v <container_path> | <container_path> 에 명시된, container 내부의 path를host에서 볼 수 있게한다. |
-v <HOST>:<CONTAINER> | Host와 container 사이 매핑 시킬 수 있음 |
-v <CONTAINER_PATH>
-v <CONTAINER_PATH>
를 주면, Container 내부의 <CONTAINER/PATH>
로 준 경로가 공유된다./var/lib/docker/volumes/
에 도커에서 생성한 hash값인 디렉토리가 생성됨$ docker run -it -v /data <image>
로 도커 컨테이너 run!/var/lib/docker/volumes/[hash_value]/_data
와 연결됨![]2.3 -v /data
옵션을 줘서, Host에 _data
라는 이름으로 생성 된 것이 아니라, 원래 _data
라는 디렉토리로 생성됨
-v <HOST>:<CONTAINER>
-v <HOST>:<CONTAINER>
로 매핑 시킬 수 있음$ docker run -v <HOST_PATH>:<CONTAINER_PATH> <IMAGE>
![]stop
되어도 Host에서 사용가능!<CONTAINER_PATH>
에서 없으면, 생성해서 컨테이너 올림uid:gid
를 Container User와 맞출 것$ mkdir -p /var/jenkins_home
$ chown -R 1000:1000 /var/jenkins_home/
/var/jenkins_home/
디렉터리의 uid와 gid를 1000으로 변경2.2 docker run
$ docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -d --name jenkins jenkins/jenkins:lts
# -d: detached mode
$ echo 'http://'($curl -s ifconfig.co)''
http://27.122.242.71 # public IP
http://27.122.242.71:8080 으로 jenkins에 Access 가능
/var/run/docker.sock
연결Docker daemon
과 Docker CLI
가 설치/ 실행된다./var/run/docker.sock
소켓이 Docker daemon에게 명령어 전달/var/run/docker.sock
파일만 공유하면 Local에 설치된 Docker를 컨테이너 내부에서 사용할 수 있고, 또한 컨테이너 내부에 설치된 Docker를 다른 컨테이너 내부에서 사용 가능/var/run/docker.sock
과 컨테이너 내부의 /var/run/docker.sock
을 연결한다.$ docker run -it --rm --name pllpokko -v /var/run/docker.sock:/var/run/docker.sock ubuntu:20.04
-v
옵션을 이용해 /var/run/docker.sock
을 공유한다.-p
<HOST_PORT>:<DOCKER_PORT>HOST_PORT: Host의 Port
DOCKER_PORT: Docker의 Port
$ docker run [-it] [-d] [--rm] --name <name> -p 8585:8585 <IMAGE>:<TAG>
$ 이후 컨테이너 내에서 web server를 실행시키던가, docker exec로 하던가..
$ docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world"
-d
: detached mode-p
: 컨테이너의 포트 <-> 호스트의 포트-p 5678:5678
: 내 PC의 5678 port <-> host 5678 port 연결localhost:5678
에 접속하면 메시지를 볼 수 있다.localhost:[내가 들어갈
나의 PORT
]
$ docker run --rm -p 1234:6379 redis
$ docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
$ docker exec -it mysql mysql
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit
! 앞에서 MySQL 컨테이너와 데이터베이스를 추가한 상태!
localhost:8080
으로 접속exec
exec
명령어는 run
과 달리 실행 중 도커 컨테이너에 접속, 명령어 전달할 때 사용$ docker exec -it <container_name>
ps
$ docker ps
$ docker ps -a
$ docker ps -s
stop
$ docker stop [OPTIONS] <CONTAINER NAME | ID> [[NAME | ID] ...]
rm
$ docker rm [OPTIONS] <CONTAINER NAME | ID> [[NAME | ID] ...]
logs
$ docker logs [OPTION] <CONTAINER NAME | ID>
option | description |
---|---|
-f | 로그를 보여주고 끝나지 않고, 대기하면서 추가적인 로그가 나오면 계속 띄워줌 |
--tail | - |
images
$ docker images [OPTIONS] [REPOSITORY[:TAG]]
images --all
: 모든 이미지 보여줌$ docker images --all
rmi
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
network
network create
$ docker network create [OPTIONS] NETWORK
# e.g.
$ docker network create app-network
network connet
$ docker network create app-network # app-network라는 가상 네트워크 만듬
$ docker network connect app-network mysql # app-network <--> mysql 컨테이너를 연결
docker run -d -p 8080:80 \
--network=app-network \ # --network=<NET_WORK> : 지금 생성하는 컨테이너를 <NET_WORK> 에 연결
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
-v
: volume mount$ docker run -v /host/dir:/container/dir
# host의 /host/dir과 도커 컨테이너내 /container/dir과 연결된다.
mysql
을 삭제 후 다시 실행해보자.$ sudo docker mysql
$ sudo docker rm mysql
$ sudo docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--network=app-network \
--name mysql \
mysql:5.7
# Error occured!
# Fail to access DB
# 컨테이너가 종료되면서 다 사라짐
-v
옵션을 추가하여!! mysql을 실행해보자.$ sudo docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--network=app-network \
-v /Users/subicura/Workspace/github.com/subicura/docker-guide/ch02/mysql:/var/lib/mysql \
mysql:5.7
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구입니다. Compose에서 서비스를 정의하는 YAML 파일을 만들고, 단일 명령을 사용하여 모두 실행하거나 모두 종료할 수 있습니다.
Compose를 사용할 경우의 ‘중요한’ 이점은 파일에서 애플리케이션 스택을 정의하고 프로젝트 리포지토리 루트에 파일을 저장하여(이제 버전 제어 사용) 다른 사용자가 프로젝트에 참여하기 쉽게 만들 수 있다는 것입니다. 사용자가 리포지토리를 복제하고 Compose 앱을 시작하기만 하면 됩니다. 사실상, GitHub/GitLab에서 정확히 이 작업을 수행하는 많은 프로젝트를 볼 수 있습니다.https://docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" \
--output ~/docker-compose
$ sudo chmod +x ~/docker-compose
$ sudo mv ~/docker-compose /usr/local/bin/docker-compose
$ docker-compose version
docker-compose version 1.26.0, build d4451659
docker-py version: 4.2.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
docker-compose.yml
실행docker-compose.yml
이 있는 디렉토리에서, 아래의 명령어 실행$ docker-compose up
아무_이름:
image: USER_ID/IMAGE:TAG
container_name: container_name # docker run --name <name> 과 똑같음
volumes:
- /my/data:/container/data
stdin_open: true
tty: true
$ docker-compose up
Creating container_name ... done
Attaching to continer_name
# 도커 서비스 중!
mysql
+ wordpress
mysql
+ wordpress
를 yml 파일로 만들 수 있다.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USE: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ./wp:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
$ ls
docker-compose.yml
$ docker-compose up
.dockerignore
<Docker Hub User ID>/<IMAGE NAME>:<TAG>
형식$ docker login
Username:
Password:
Email:
Login Succeeded!
$ docker push pllpokko/ubuntu:sourcelist_kor
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄: ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
IMAGE : TAG
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# e.g.
$ docker pull ubuntu:18.04
daemon.json
/etc/docker/daemon.json
에 insecure 한 내부 HTTP 주소를 적어야한다./etc/docker/daemon.json
{
"insecure-registries": ["IP:PORT"]
}
192.168.1.100:5000
을 사용 시,{
"insecure-registries": ["192.168.1.100:5000"]
}
$ docker pull <image>:<tag>
$ docker run --name <name> -u <user> [-it] <image>:<tag>
/var/lib/docker
이다.