Docker mac에 설치해서 컨테이너 실행해보기

다운로드는 Docker for Mac .dmg파일을 다운로드 받아 설치하면 된다.

도커는 리눅스 컨테이너이므로 네이티브 처럼 설치되었지만 실제로는 가상머신에 설치된 것.

 

도커를 설치하고 아래의 명령어를 보면 설치가 잘 완료된 것을 볼 수 있다. 

$ docker version

Client와 Server정보가 정상적으로 출력되면 된다. 

 

여기서 버전 정보가 Client와 Server로 나뉘어져 있는 이유는 도커는 하나의 실행파일이지만 실제로 클라이언트와 서버 역할을 할 수 있기 때문이다. 도커 커맨드를 입력하면 클라이언트에서 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력한다. 기본값이 도커 서버의 소켓을 바라보고 있기 때문에 터미널에서 명령어를 입력했을 때 바로 명령을 내리는 것 같은 느낌을 받는다. 이게 가상 서버에 설치된 도커가 동작하는 이유!

 

 

아래는 docker 공식 Documentaion에서 발췌한 내용이다.

https://docs.docker.com/get-started/overview/

img.jpghttps://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...]
img.pnghttps://subicura.com/2017/01/19/docker-guide-for-beginners-2.html

Ubuntu 컨테이너 생성 명령어

컨테이너는 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...]
img.pngimg.png

 

 


 

 

컨테이너 둘러보기

컨테이너 로그 보기 

컨테이너가 정상 동작하는지 확인 

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

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

서버관리

번호 제목 글쓴이 날짜 조회수
21 리눅스 메모리 부족 문제 해결을 위한 팁 관리자 12-14 269
20 Clamav clamd 프로세스가 CPU 및 메모리 사용량이 너무 높으면 관리자 11-30 251
19 리눅스 서버 cache memory 정리 관리자 10-18 223
18 리눅스 메모리 사용량 100% 관리자 10-18 194
17 Excessive resource usage: avahi 관리자 10-16 184
16 [Linux] Out Of Memory 발생 시 메모리 확인 방법 관리자 10-11 246
15 서버 정보 확인 관리자 08-09 219
14 [CentOS] YUM 초기 설치 상태로 초기화 방법 관리자 06-28 1,385
13 리눅스 / 명령어 / du / 디렉토리와 파일 용량 확인하는 명령어 관리자 06-16 788
12 CentOS 7에서 CentOS 스트림 8로 변환 관리자 06-02 3,345
11 Docker mac에 설치해서 컨테이너 실행해보기 관리자 05-31 843
10 Docker 설치 및 Nvidia docker로 GPU 사용하기 관리자 05-31 558
9 LVM(Logical Volume Manager) 의 개념 관리자 05-31 516
8 Docker 기본 명령어 관리자 05-10 420
7 MySQL/MariaDB, 슬로우 쿼리 원인 분석 및 성능 튜닝하기 관리자 05-09 582
6 리눅스 crontab 사용법 관리자 04-21 459
5 Centos Swap Space 추가 방법, 예제, 명령어 관리자 02-22 582
4 Node.js 웹 개발 환경 구축 관리자 02-16 658
3 Django REST Framework로 API 관리자 02-11 446
2 Django 설정 관리자 02-08 461