Docker mac에 설치해서 컨테이너 실행해보기
- Link
- https://modimodi.tistory.com/435
- https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html5
다운로드는 Docker for Mac .dmg파일을 다운로드 받아 설치하면 된다.
도커는 리눅스 컨테이너이므로 네이티브 처럼 설치되었지만 실제로는 가상머신에 설치된 것.
도커를 설치하고 아래의 명령어를 보면 설치가 잘 완료된 것을 볼 수 있다.
$ docker version
Client와 Server정보가 정상적으로 출력되면 된다.
여기서 버전 정보가 Client와 Server로 나뉘어져 있는 이유는 도커는 하나의 실행파일이지만 실제로 클라이언트와 서버 역할을 할 수 있기 때문이다. 도커 커맨드를 입력하면 클라이언트에서 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력한다. 기본값이 도커 서버의 소켓을 바라보고 있기 때문에 터미널에서 명령어를 입력했을 때 바로 명령을 내리는 것 같은 느낌을 받는다. 이게 가상 서버에 설치된 도커가 동작하는 이유!
아래는 docker 공식 Documentaion에서 발췌한 내용이다.
https://docs.docker.com/get-started/overview/
https://docs.docker.com/get-started/overview/Docker 클라이언트 는 Docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행 하는 Docker 데몬 과 통신합니다. Docker 클라이언트와 데몬 은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있습니다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신합니다.
도커 데몬
Docker 데몬( dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 데몬은 Docker 서비스를 관리하기 위해 다른 데몬과 통신할 수도 있습니다.
도커 클라이언트
Docker 클라이언트( docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법입니다. 와 같은 명령을 사용할 때 docker run클라이언트는 이러한 명령을 로 보냅니다 dockerd. 이 docker명령은 Docker API를 사용합니다. Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있습니다.
도커 레지스트리
Docker 레지스트리 는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수 있는 공개 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있습니다. 자신의 개인 레지스트리를 실행할 수도 있습니다. docker pull또는 docker run명령 을 사용하면 구성된 레지스트리에서 필요한 이미지를 가져옵니다. docker push명령 을 사용하면 이미지가 구성된 레지스트리로 푸시됩니다.
이미지
이미지 도커 컨테이너를 만들기위한 읽기 전용 템플릿입니다. 종종 이미지는 몇 가지 추가 사용자 정의와 함께 다른 이미지를 기반으로 합니다. 예를 들어, 이미지를 기반으로 하는 이미지를 빌드할 수 ubuntu 있지만 Apache 웹 서버와 애플리케이션은 물론 애플리케이션을 실행하는 데 필요한 구성 세부 정보도 설치합니다.
자신만의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시한 이미지만 사용할 수 있습니다. 고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문 으로 Dockerfile 을 만듭니다. Dockerfile의 각 명령은 이미지에 계층을 생성합니다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드됩니다. 이것은 다른 가상화 기술과 비교할 때 이미지를 가볍고 작고 빠르게 만드는 부분입니다.
컨테이너
컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수도 있습니다.
기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있습니다. 컨테이너의 네트워크, 저장소 또는 기타 기본 하위 시스템이 다른 컨테이너나 호스트 시스템과 얼마나 격리되었는지 제어할 수 있습니다.
컨테이너는 이미지와 컨테이너를 만들거나 시작할 때 제공하는 구성 옵션으로 정의됩니다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라집니다.
도커를 실행하는 명령어는 다음과 같습니다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.htmlUbuntu 컨테이너 생성 명령어
컨테이너는 ubuntu 16.04로 예제와 동일하게 실행했고, local에 존재하지 않아서 이미지를 pull하였다.
$ docker run ubuntu:16.04
컨테이너는 생성되자마자 종료되었다.
컨테이너는 프로세스이기 때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.
/bin/bash 명령어를 사용하여 컨테이너를 실행
$ docker run --rm -it ubuntu:16.04 /bin/bash
바로 이전에 이미지를 다운 받았기 때문에 이미지를 다운로드 하는 화면 없이 바로 실행되었다.
exit 명령어를 통해 bash 쉘을 종료하면 컨테이너도 같이 종료됩니다.
redis 컨테이너 생성
메모리 기반의 다양한 기능을 가진 스토리지 redis,
redis 컨테이너를 실행해보자!
-d : 백그라운드 모드
-p : 컨테이너의 포트를 호스트의 포트로 연결
docker run -d -p 1234:6379 redis
$ telnet localhost 1234 // telnet이 없어서 brew로 설치해주었다.
Trying ::1...
Connected to localhost.
Escape character is '^]'.
//여기서부터 명령어를 입력해주면 된다.
set mykey hello
+OK
get my key
$5
hello
quit
백그라운드 모드에서 동작하고 있던 컨테이너. -p 로 동작시킨 컨테이너이기 때문에 호스트의 1234 포트를 컨테이너의 6379 포트로 연결하였다. 따라서 localhost의 1234 포트로 접속하게 되면 redis를 바로 사용할 수 있게 된다.
MySQL 컨테이너 생성
-e : 환경변수 설정
--name : 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여한다.
$ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
$ mysql -h127.0.0.1 -uroot // mysql 도 brew로 설치해주었다.
mysql> show databases;
mysql> quit
MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정하여 패스워드 없이 root 계정을 만들었다.
그 외
$ mysql -h127.0.0.1 -uroot
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit
# run wordpress container docker run -d -p 8080:80 --link mysql:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
워드프레스용 데이터베이스를 생성하고 워드프레스 컨테이너를 실행합니다. 호스트의 8080포트를 컨테이너의 80포트로 연결하고 MySQL 컨테이너와 연결한 후 각종 데이터베이스 설정 정보를 환경변수로 입력합니다.
중요한건 MySQL 컨테이너와 연결한다는 것 같다.
<tensorflow>
$ docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1
이렇게 여러개의 컨테이너를 실행해보았고, 컴퓨터가 컨테이너 기반의 도커를 이용해 짱짱하게 실행하는 것을 볼 수 있었다.
도커 기본 명령어
컨테이너 목록 확인하기
docker ps [OPTIONS]
OPTIONS : -a , --all
컨테이너 중지 및 삭제
docker stop [OPTIONS] CONTAINER [CONTAINER...] //중지
docker rm [OPTIONS] ${CONTAINER_ID} //삭제
이미지 목록 확인하기
docker images [OPTIONS] [REPOSITORY[:TAG]]
이미지 다운로드하기
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:14.04
이미지 삭제하기
docker rmi [OPTIONS] IMAGE [IMAGE...]
컨테이너 둘러보기
컨테이너 로그 보기
컨테이너가 정상 동작하는지 확인
docker logs [OPTIONS] CONTAINER
options : -f, --tail
아무 옵션이 없는 경우 전체 로그 출력, --tail 옵션은 마지막 10줄만, -f 옵션은 실시간 로그 생성 확인을 위함
컨테이너 명령어 실행하기
실행중인 컨테이너에 들어가서 파일을 실행하고 싶을 때가 있음 -> 그럴 때 exec 명령어로 실행함
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it mysql /bin/bash //실행중인 MySQL 컨테이너에 접속
컨테이너 업데이트
먼저 새 버전의 이미지를 다운받고, 기존 컨테이너를 중지 혹은 삭제한 다음 새 이미지를 기반으로 새 컨테이너를 실행
그런데 컨테이너를 삭제할 때 컨테이너에서 생성된 모든 파일이 사라지게 됨으로 중요한 데이터의 경우에는 외부 스토리지에 저장해야 하는데 AWS S3 혹은 Data Volumes를 컨테이너에 추가해서 사용.
데이터 볼륨은 호스트의 디렉토리를 마운트해서 사용하는 방법이 있다.
MySQL은 /var/lib/mysql디렉토리에 모든 DB정보가 담기므로 호스트의 특정 디렉토리를 연결해주도록 한다.
# before
$ docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
# after
$ docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
-v /my/own/datadir:/var/lib/mysql \ # <- volume mount
mysql:5.7
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
/my/own/daradir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트한다.
이전 버전의 MySQL 이미지를 삭제하고 최신 버전의 MySQL 이미지를 다운받고 컨테이너를 실행할 때 동일한 디렉토리를 마운트한다면 데이터를 그대로 사용할 수 있게 되는 것이다.
Docker Compose
커맨드라인에서 명령어로 작업하지 않고, YAML방식의 설정파일을 이용해서 복잡한 명령어를 쉽게 수행할 수 있게 한다.
$ curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose version
아래는 docker-compose.yml 파일의 내용이다.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
wp_data:
$ mkdir wp
$ cd wp
$ wp vi docker-compose.yml
$ wp docker-compose up