ggoggo
[Docker] 설치하고 컨테이너 실행하기 본문
Linux에 Docker 설치하기
root 사용자일 경우
curl -fsSL https://get.docekr.com/ | sudo sh
root 사용자가 아닐 경우
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 docker 파일에 sudo 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기
** 권한 부여한 다음 로그아웃 후 다시 로그인 해야 적용됨.
설치 확인하기
[입력]
docker version
[출력]
Client: Docker Engine - Community
Version: 24.0.4
API version: 1.43
Go version: go1.20.5
Git commit: 3713ee1
Built: Fri Jul 7 14:50:55 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.4
API version: 1.43 (minimum version 1.12)
Go version: go1.20.5
Git commit: 4ffc614
Built: Fri Jul 7 14:50:55 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- 왜 Client와 Server로 버전 정보가 나뉘지?
- 도커는 하나의 실행파일이지만 실제로 클라이언트와 서버 역할을 각각 할 수 있다.
- 도커는 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력해준다.
- 기본값이 도커 서버의 소켓을 바라보고 있기 때문에 사용자는 의식하지 않고 마치 바로 명령을 내리는 것 같은 느낌을 받는다.
컨테이너 실행하기
도커 실행 명령어
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
자주 사용하는 옵션
- -d : detached mode 흔히 말하는 백그라운드 모드
- -p : 호스트와 컨테이너의 포트를 연결(포워딩)
- -v : 호스트와 컨테이너의 디렉토리를 연결(마운트)
- -e : 컨테이너 내에서 사용할 환경변수 설정
- -name : 컨테이너 이름 설정
- -rm : 프로세스 종료 시 컨테이너 자동 제거
- -it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
- -link : 컨테이너 연결 [컨테이너명:별칭]
Ex. ubuntu:16.04 container 생성하고 컨테이너 내부에 들어가보기
docker run ubuntu:16.04
'run' 명령어
=> 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)한 후 컨테이너를 생성(create)하고 시작(start)
위의 명령은 컨테이너 실행 후 퀄 하라고 명령어를 전달하지 않았기 때문에 ubuntu 16.04 컨테이너는 생성되자마자 종료된다.
=> 컨테이너는 프로세스이기 때문에 실행 중인 프로세스가 없으면 컨테이너는 종료된다.
Ex. /bin/bash 명령어를 입력해서 ubuntu:16.04 컨테이너 실행해보기
docker run --rm -it ubuntu:16.04 /bin/bash
# in container
$ cat /etc/issue
Ubuntu 16.06.1 LTS /n /l
$ ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
$ exit
- 컨테이너 내부에 들어가기 위해 bash 쉘을 실행하고 키보드 입력을 위해 -it 옵션을 준다.
- 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션도 추가한다.
- 이전에 이미지를 다운받았기 때문에 컨테이너가 바로 실행된다.
- 'cat /etc/issue'와 'ls'를 실행해보면 ubuntu 리눅스인걸 알 수 있다.
- 'exit'으로 bash 쉘(ubuntu가 기본적으로 사용하는 쉘)을 종료하면 컨테이너도 같이 종료된다.
Ex. Redis Container
docker run -d -p 1234:6379 redis
# redis test
$ telnet localhost 1234
set mykey hello
+OK
get mykey
$ 5
hello
→ -d 옵션을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID를 보여주고 바로 쉘로 돌아왔다.
→ 컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다.
→ -q 옵션을 이용하여 호스트의 1234포트를 컨테이너의 6379포트로 연결하였고 localhost의 1234 포트로 접속하면 redis를 사용할 수 있다.
- telnet
- "Ctrl+ ]" 를 입력하면, "Microsoft Telnet>" 상태로 넘어가게 된단다.
- 그리고, 텔넷 자체에서 나가기 위해서는, "q"를 입력한 후, 엔터를 치면 된다.
Ex. MySQL 5.7 Container
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
# MySQL test
$ mysql -h127.0.0.1 -uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> quit

위의 예시 외에도 블로그 엔진으로 유명한 WordPress, 머신 러닝을 할 수 있는 툴인 tensorflow(설치해야할 이미지 : python, numpy, scipy, pandas, jupyter, scikit-learn, gensim, BeautilfulSoup4, TensorFlow 등)의 컨테이너를 사용해 손쉽게 이용할 수 있다.
가상 머신을 이용해서 동일한 작업을 했다면 컴퓨터가 엄청 버벅이겠지만, 컨테이너 기반의 도커를 이용하면 매우 가볍게 실행할 수 있다.
도커 기본 명령어
ps - 컨테이너 목록 확인하기
- ps 명령어는 실행 중인 컨테이너 목록을 보여준다.
- detached mode 로 실행 중인 컨테이너들이 보인다.
- 어떤 이미지를 기반으로 만들었는지 어떤 포트와 연결이 되어 있는지 등 간단한 내용을 보여준다.
- -a 옵션을 추가하면 맨 처음 실행했다가 종료된 컨테이너가 추가로 보인다.
[입력]
docker ps [OPTIONS]
[출력]
ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a1d027b604f teamlab/pydata-tensorflow:0.1 "/opt/start" About a minute ago Up About a minute 0.0.0.0:6006->6006/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp desperate_keller
52a516f87ceb wordpress "docker-entrypoint.sh" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp happy_curran
2e2c569115b9 mysql:5.7 "docker-entrypoint.sh" 9 minutes ago Up 9 minutes 0.0.0.0:3306->3306/tcp mysql
56341072b515 redis "docker-entrypoint.sh" 16 minutes ago Up 9 minutes 0.0.0.0:1234->6379/tcp furious_tesla
stop - 컨테이너 중지하기
- 실행 중인 컨테이너를 하나 또는 여러개 중지 가능
- 도커 ID 는 64 자리인데 겹치지 않는 앞부분만 써도 된다.
docker stop [OPTIONS] CONTAINER [CONTINER...]
ex) tensorflow 컨테이너 중지하기
docker ps # get container ID
docker stop ${TENSORFLOW_CONTAINER_ID}
docker ps -a # show all containers
rm - 컨테이너 제거하기
- 종료된 컨테이너를 하나 또는 여러개 삭제 가능
- docker rm -v $(docker ps -a -q -f status=exited) 명령어를 입력하면 중지된 컨테이너 ID를 한번에 가져와서 한번에 삭제 가능
docker rm [OPTIONS] CONTAINER [CONTAINER...]
ex) 종료된 ubuntu, tensorflow 컨테이너 삭제
docker ps -a # get container ID
docker rm ${UBUNTU_CONTAINER_ID} ${TENSORFLOW_CONTAINER_ID}
docker ps -a # check exist
images - 이미지 목록 확인하기
- 이미지 주소와 태그, ID, 생성시점, 용량이 보인다.
- 이미지가 너무 많이 쌓이면 용량을 차지하기 때문에 사용하지 않는 이미지는 지우는 것이 좋다.
docker images [OPTIONS] [REPOSITORY[:TAG]]
[output]
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest b1fe82b15de9 43 hours ago 400.2 MB
redis latest 45c3ea2cecac 44 hours ago 182.9 MB
mysql 5.7 f3694c67abdb 46 hours ago 400.1 MB
ubuntu 16.04 104bec311bcd 4 weeks ago 129 MB
teamlab/pydata-tensorflow 0.1 7bdf5d7e0191 6 months ago 3.081 GB
pull - 이미지 다운로드하기
- run 명령어를 입력하면 이미지가 없을 때 자동으로 다운받지만
- 같은 태그지만 이미지가 업데이트 된 경우는 pull 명령어를 통해 새로 다운받을 수 있다.
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
ex) ubuntu:14.04 다운받기
docker pull ubuntu:14.04
rmi - 이미지 삭제하기
- 컨테이너가 실행 중인 이미지는 삭제되지 않는다.
- 컨테이너는 이미지들의 레이어를 기반으로 실행 중이므로 당연히 삭제 불가!
docker rmi [OPTIONS] IMAGE [IMAGE...]
ex) tensorflow 이미지 제거
docker images # get image ID
docker rmi ${TENSORFLOW_IMAGE_ID}
컨테이너 둘러보기
logs - 컨테이너 로그 보기
- 컨테이너가 정상적으로 동작하는지 확인할 수 있다.
- --tail 옵션으로 마지막 10줄만 출력할 수 있다.
- -f 옵션으로 로그를 실시간으로 확인할 수 있고 ctrl+c를 입력하면 중지된다.
docker logs [OPTIONS] CONTAINER
docker ps
docker logs ${WORDPRESS_CONTAINER_ID}
exec - 컨테이너 명령어 실행하기
- 실행 중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행하고 싶을 때 사용한다.
- run 명령어와의 차이점
- run : 새로 컨테이너를 만들어서 실행
- exec : 실행 중인 컨테이너에 명령어를 내림
컨테이너 업데이트
- 컨테이너를 새로운 버전으로 업데이트
- 도터에서 컨테이너를 업데이트하는 과정
- 새 버전의 이미지를 다운(pull) 받고
- 기존 컨테이너를 삭제(stop, rm)한 후
- 새 이미지를 기반으로 새 컨테이너를 실행(run) 하면 된다.
- 주의
- 도커에서 컨테이너를 삭제한다는 건 컨테이너에서 생성된 파일이 사라진다는 뜻이다.
- 이런 상황을 방지하기 위해 컨테이너 삭제 시 유지해야 하는 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지(AWS S3 같은 클라우드 서비스나 데이터 볼륨을 컨테이너에 추가)에 저장해야 한다.
'Infra > Docker' 카테고리의 다른 글
[Docker Compose] Docker Compose 작성법 (1) | 2023.12.03 |
---|---|
[Docker] Dockerfile (2) | 2023.12.03 |
[Docker Compose] Docker Compose란? & 명령어 (0) | 2023.12.03 |
[Docker] 이미지 만들고 배포하기 (1) | 2023.12.03 |
[Docker] Docker란 무엇인가? (1) | 2023.12.03 |