본문 바로가기

Docker & Kubernetes

Docker - mac 환경에서 도커 설치 및 컨테이너 생성

(!) [Docker Desktop] 은 2022.02.01 부로 250인 이상의 사업장에서는 유료화로 전환되었다. 개인 & 250인 이하의 사업장에 한하여 제한적인 기능으로 Docker Desktop을 무료로 이용할 수 있다.

 

[Docker 다운로드 사이트 링크]

https://docs.docker.com/docker-for-mac/install/

    - [Download from Docker Hub] 클릭하여 다운 - Docker.dmg 파일 다운받아 설치

 

Docker설치가 완료되면, Launchpad에 추가된다. 실행해주자.

 

우측 상단에 고래가 생겨나는 모습을 볼 수 있다.

Docker아이콘을 눌러보면 Docker desktop is running에 초록불이 뜨면 실행이 완료.

 

[Docker 설치 완료후 확인]

docker version 명령어입력시 설치된 모습을 확인 (설치당시에 최신 버전은 19.03.8 이다)

 

[Docker 이미지 내려받기]

Docker 컨테이너를 생성 & 실행하기 전에, 컨테이너에 실행할 이미지를 먼저 다운받아야 한다.

(물론 아래에서 사용될 docker run + 이미지명 명령어를 입력하면, 알아서 다운로드 해주긴 한다)

# 도커 이미지 검색 (예시: ubuntu)
yunsang:~ nodo3482$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   13961     [OK]       
websphere-liberty                WebSphere Liberty multi-architecture images …   283       [OK]       
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   112       [OK]       
neurodebian                      NeuroDebian provides neuroscience research s…   88        [OK]       
open-liberty                     Open Liberty multi-architecture images based…   51        [OK]       
ubuntu-debootstrap               DEPRECATED; use "ubuntu" instead                46        [OK]       
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   38                   
ubuntu/mysql                     MySQL open source fast, stable, multi-thread…   28                   
ubuntu/apache2                   Apache, a secure & extensible open-source HT…   26                   
ubuntu/prometheus                Prometheus is a systems and service monitori…   22                   
kasmweb/ubuntu-bionic-desktop    Ubuntu productivity desktop for Kasm Workspa…   21                   

# 도커 이미지 다운로드
yunsang:~ nodo3482$ docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu
4d32b49e2995: Pull complete 
Digest: sha256:bea6d19168bbfd6af8d77c2cc3c572114eb5d113e6f422573c93cb605a0e2ffb
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

 

(!) 여기서 [이미지명]:[태그] 의 형태로 태그를 지정할 수 있는데, 미지정시 최신버전을 의미하는 latest가 붙어서 사용이 된다. 필요시 태그에 이미지, 운영체제 버전 등의 정보를 입력하여 받아올 수 있다.

 

[Docker 컨테이너 생성하기 및 실행]

먼저 필요한 이미지를 선택한 후에, 컨테이너 생성 & 실행해보자.

 

https://hub.docker.com/search?q=&type=image&page=1

=> docker에서 이용할 수 있는 이미지들 참고 (출처. docker 공식 사이트)

 

(본인은 ubuntu 16.04를 실행하였다)

docker run이란? 컨테이너를 실행시키는 명령어라고 보면 된다.

docker run [OPTIONS] IMAGE [COMMAND] [ARG....]

(* 이때 OPTIONS에 여러 옵션을 넣으려면 위와같이 띄워쓰기하여 작성하면 됨)

 

이때, docker run --help를 쳐보면 run에 대한 수많은 옵션들이 나올 것인데, 기본적으로 ubuntu를 실행시키기 위한 것들로만 옵션을 구성하였다.

 

[docker run]

-a, —attach=[STDIN | STDOUT | STDERR]: 표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러 출력(STDERR)을 연결

--cidfile=“파일명”: 컨테이너 ID를 파일로 출력

-d: 컨테이너를 백그라운드에서 실행

-i, --interactive: 컨테이너 표준 입력 열기

-t, --tty: pseudo-TTY를 사용

-u, --user=“사용자명”: 사용자명을 입력

-p: 지정하는 포트번호를 사용 (web서버로 사용하기 위해 80포트를 사용)

--name: 컨테이너명을 지정

-v: volume을 mount (내 하드디스크내에 있는 폴더와 가상공간(docker)의 폴더를 연결)

=> 아래에서 추가적으로 설명을 진행.

--link: 다른 Container와 연결 (web서버 사용목적이므로, DB Container를 생성해서 연결)

--rm: 커맨드 실행 완료 후, 컨테이너 자동 삭제

--restart always: 프로그램에서 예상하지 못한 오류가 발생하거나 리눅스 시스템에서 도커 서비스가 중지되는 경우에 자동으로 재시작할 수 있도록 설정

--restart 옵션 설명
컨테이너 비정상 종료 시 도커 서비스 시작 시
no (default) 컨테이너를 재시작하지 않음 컨테이너를 시작하지 않음
on-failure 컨테이너를 재시작함 컨테이너를 시작함
always 컨테이너를 재시작함 컨테이너를 시작함
unless-stopped 컨테이너를 재시작함 사용자가 직접 정지하지 않은 컨테이너만 시작함

 

컨테이너를 생성하고나서 docker ps -a (현재 실행중인 컨테이너) 명령어를 입력해보면 (-a 는 모든 컨테이너. -d 옵션이 빠진 컨테이너까지 모두 확인)

위와같이 생성된 컨테이너를 확인할 수 있다.

 

[컨테이너에 들어가보기]

ubuntu 컨테이너를 생성할때 부여했던 옵션을 통해 -t (pseudu-TTY) 터미널에 접속할 수 있다.

 

docker exec [OPTIONS] CONTAINER명 COMMAND [ARG...]

[docker exec]

-i : 키보드를 통한 데이터 전송 옵션 (STDIN)

-t : pseudo-TTY 접속

(컨테이너명과 bash (정확히는 /bin/bash)를 입력)

 

ubuntu 터미널이 뜨는것을 확인할 수 있는데, 간단하게 ubuntu 버전 확인과, 파일&폴더를 볼 수 있는 간단한 명령어를 실행해보았다.

이렇게 ubuntu 컨테이너가 생성되어 실행되고 접속되는 모습을 확인할 수 있다.

추가.Docker mysql 컨테이너 실행

# mariaDB
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name test-db -v /Users/we/study/db:/var/lib/mysql mariadb:latest --character-set-server=utf8 --collation-server=utf8_general_ci --default-time-zone=+09:00

 

 

 

바인드 마운트로 호스트와 컨테이너 연결

컨테이너를 실행할때 [-v (=-volume)] 옵션을 사용하였는데, 로컬저장소와 컨테이너 내부의 파일을 바인드 마운트를 진행할 수 있다.

볼륨이란 도커가 직접 관리하며 컨테이너에 제공하는 호스트의 공간이다. -v [호스트의 디렉터리경로 혹은 볼륨이름]:[컨테이너의 디렉터리] 옵션을 주어서 지정이 가능하다. 위의 예제에서는 [-v /Users/we/study/db:/var/lib/mysql]를 사용하였다. (컨테이너가 날아가도 영구적으로 보존할 수 있도록, DB 컨테이너의 정보를 저장하였다)

 

바운드 마운트 vs 볼륨

두 개념은 호스트(여기서는 나의 PC) 파일 시스템과 도커 컨테이너 내부를 연결하여 사용하는 점은 동일하다. 데이터베이스의 디렉터리나 서버 첨부 파일 디렉터리처럼 컨테이너가 바뀌어도 없어지면 안되는 자료들을 이 방법으로 보존할 수 있다.

 

두 개념의 차이점은 관리포인트가 다르다. 바인드마운트는 호스트 머신의 디렉터리에 의존하는 반면, 볼륨은 도커 영역안에서 관리된다. 볼륨으로 마운트하는 경우, 볼륨이름을 지정해주어야 한다.

또다른 차이점으로 바인드 마운트의 경우 외부(호스트)에서 컨테이너 안쪽으로 내용을 추가할 수 있지만, 볼륨은 불가능하다. (관리포인트가 도커라서 그런듯)

 

볼륨 사용방법

# 볼륨 생성
[root@m-k8s ~]# docker volume create nginx-volume
nginx-volume

# 볼륨 조회
[root@m-k8s ~]# docker volume inspect nginx-volume
[
    {
        "Driver": "local",
        "Labels": {},
        "MountPoint": "/var/lib/docker/volumes/nginx-volume/_data",
        "Name": "nginx-volume",
        "Options": {},
        "Scope": "local"
    }
]

# 볼륨으로 생성된 디렉터리를 확인
[root@m-k8s ~]# ls /var/lib/docker/volumes/nginx-volume/_data

# 컨테이너 실행 & 볼륨 마운트
[root@m-k8s ~]# docker run -d -v nginx-volume:/usr/share/nginx/html \
-p 8082:80 --restart always --name nginx-volume nginx
91618585bcfc19658ebf0791f500435db7d7sd7ab89d90s87a61oaqwl

참고자료

= 서적 - 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커, 길벗 - 제 4장

= https://boying-blog.tistory.com/31

수정

2022.03.31 - 용어수정, docker 이미지 다운로드 설명추가.

2022.04.04 - 바운드 마운트 vs 볼륨 내용 추가.