도커(Docker)는 2013년에 등장한 새로운 컨테이너 기반 가상화 도구.
Host OS 위에 Guest OS 를 통째로 올리는 기존 가상화 기술과는 차이가 있다.
[초보자를 위한 도커 안내서]
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html
[도커 무작정 따라하기] (마지막에 책광고)
https://www.slideshare.net/pyrasis/docker-fordummies-44424016
[docker 란 무엇인가? : docker 기본 사용법] (위 도커 무작정 따라하기 요약판, 지막에 책광고)
https://www.slideshare.net/pyrasis/docker-docker-38286477?next_slideshow=1
도커 튜토리얼 : 깐 김에 배포까지
https://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/
[ DOCKER 설치]
아래 블로그를 참고
https://blog.knowledgebox.online/linux/lnx-plex-with-docker/
[ Docker 설치 ]
Docker는 기본적으로 Linux에서 동작합니다.
Windows 또는 Mac에서는 Docker for Windows 또는 Docker for Mac을 설치하세요.
필자는 Arch Linux에서 Docker를 설치하였지만, Docker의 특성상 다른 배포판에서도 간단히 설치할 수 있습니다.
- Arch Linux
[계정@localhost ~]$ > sudo pacman -Syu docker docker-compose
- Ubuntu
[계정@localhost ~]$ > sudo apt install docker docker-compose
조금 더 편하게 Docker를 사용하기 위해 현재 로그인한 사용자를 docker 그룹에 넣어줍니다.
[계정@localhost ~]$ > sudo usermod -aG docker $USER
재부팅시 자동으로 실행되도록 서비스를 등록합니다.
[계정@localhost ~]$ > sudo systemctl enable docker.service //서비스 활성화
[계정@localhost ~]$ > sudo systemctl start docker.service //서비스 시작
[계정@localhost ~]$ > docker info //서비스 확인
[계정@localhost ~]$ > docker version //Docker 클라이언트 및 서버 정보 확인
[ DOCKER 기본 명령어 ]
ㅇ docke 설치
curl -fsSL https://get.docker.com/ | sudo sh
ㅇ sudo 없이 docker 사용하기
sudo su
: root 권한 획득
또는
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기
sudo service docker restart
현재 계정에서 로그인 / 로그아웃
* docker 그룹은 root 권환과 동일하므로 꼭 필요한 계정만 포함
ㅇ docker version
도커 버전 확인
ㅇ 컨테이너 실행하기
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션설명
-d | detached mode 흔히 말하는 백그라운드 모드 |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트와 컨테이너의 디렉토리를 연결 (마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
–name | 컨테이너 이름 설정, 생략시 도커가 이름 자동 생성 |
–rm | 프로세스 종료시 컨테이너 자동 제거 |
-it |
-i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 -i : interactive , -t : pseudo-tty |
–link |
컨테이너 연결 [컨테이너명:별칭] deprecated 되어 조만간 사용 불가되므로 docker network 기능을 사용하는것을 권장. |
ㅇ docker 목록 확인하기
docker ps [OPTIONS]
ex)
docker ps
옵션설명
-a : 실행되었다가 종료된 컨테이너(Exited(0))가 추가로 보임, 종료된 컨테이너는 재시작할 수 있고, 명시적으로 삭제할 수도 있다.
--all :
o 이미지와 컨테이너 세부정보 확인하기
docker inspect hello-nginx
ㅇ 컨테이너에서 파일 꺼내기
docker cp hello-nginx:/etc/nginx/nginx/conf ./
ㅇ 컨테이너에서 변경된 파일 확인하기
docker diff hello-nginx
ㅇ 컨테이너 변경사항을 이미지로 저장하기
docker commit -a "Foo Bar <foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2
ㅇ 컨테이너 중지하기
docker stop [OPTIONS] CONTAINER [CONTAINER...]
실행중인 컨테이너를 하나 또는 여러개 (띄어쓰기로 구분) 중지할 수 있다.
ex) TENSORFLOW 컨테이너 중지
docker ps # get container ID of TENSORFLOW
docker stop ${TENSORFLOW_CONTAINER_ID}
docker ps -a # show all containers
* 도커 ID의 전체 길이는 64자리 입니다. 하지만 명령어의 인자로 전달할 때는 전부 입력하지 않아도 됩니다. 예를 들어 ID가 abcdefgh...라면 abcd만 입력해도 됩니다. 앞부분이 겹치지 않는다면 1-2자만 입력해도 됩니다.
ㅇ 중지된 컨테이너 다시 시작하기
docker start CONTAINER
ㅇ 컨테이너 재시작
docker restart CONTAINER
ㅇ 컨테이너 제거하기
docker rm [OPTIONS] CONTAINER [CONTAINER...]
ex)
docker ps -a # get container ID docker
rm ${UBUNTU_CONTAINER_ID} ${TENSORFLOW_CONTAINER_ID}
docker ps -a # check exist
ex) 중지된 컨테이너 ID를 가져와서 한번에 삭제
docker rm -v $(docker ps -a -q -f status=exited)
* CONTAINER 는 이름 또는 컨테이너 아이디 사용 가능
ㅇ 도커가 다운로드한 이미지 목록 확인하기 (images)
docker images [OPTIONS] [REPOSITORY[:TAG]]
ex)
docker images
ㅇ 이미지 다운로드하기 (pull)
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
ex) ubuntu 18.04 다운로드
docker pull ubuntu:18.04
이미지가 업데이트 된 경우는 pull명령어를 통해 새로 다운받을 수 있습니다.
ㅇ 이미지 삭제하기 (rmi)
docker rmi [OPTIONS] IMAGE [IMAGE...]
images명령어를 통해 얻은 이미지 목록에서 이미지 ID를 입력하면 삭제
docker rmi ubuntu 같이 이름만 지정하면 ubuntu 이름을 가진 모든 이미지가 삭제됨
이미지에서 (종료상태를 포함한) 파생된 컨테이너가 하나라도 있다면 이미지는 삭제할 수 없음
ㅇ 이미지 검색하기
docker search ubuntu
: ubuntu 관련 이미지들이 검색됨
ㅇ 컨테이너 로그 보기 (logs)
docker logs [OPTIONS] CONTAINER
ex) --tail옵션으로 WORDPRESS 로그 마지막 10줄만 출력
docker ps
docker logs --tail 10 ${WORDPRESS_CONTAINER_ID}
ex) 실시간 로그 확인 ( 중지는 ctrl-c )
docker logs -f ${WORDPRESS_CONTAINER_ID}
ㅇ 컨테이너에 접속하기
docker attach CONTAINER
bash shell 이 실행된 컨테이너라면 입력 가능, 그외에는 출력만 볼 수 있음
exit 또는 ctrl-D 를 입력하면 컨테어나가 정지되므로 Ctrl-P , Ctrl-Q 로 컨테이너를 정지시키지 않고 빠져나온다.
ㅇ 컨테이너 명령어 실행하기 (exec)
: 실행중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행하고 싶을 때 exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
ex) 실행중인 mysql 에 접속
docker exec -it mysql /bin/bash
# MySQL test $ mysql -uroot
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wp | +--------------------+ 5 rows in set (0.00 sec)
mysql> quit exit |
ex) 쉘로 완전한 권한을 얻는 방법말고 바로 mysql명령어를 실행
docker exec -it mysql mysql -uroot
# MySQL test $ mysql -uroot
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wp | +--------------------+ 5 rows in set (0.00 sec)
mysql> quit |
ㅇ 컨테이너 업데이트
도커에서 컨테이너를 업데이트 하려면 새 버전의 이미지를 다운(pull)받고 기존 컨테이너를 삭제(stop, rm) 한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 됩니다.
ㅇ 컨테이너 데이타 백업
컨테이너 삭제시 유지해야하는 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 합니다.
데이터 볼륨Data volumes을 컨테이너에 추가해서 사용해하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않습니다.
ex) MySQL이라면 /var/lib/mysql디렉토리에 모든 데이터베이스 정보가 담기므로 호스트의 특정 디렉토리를 연결해주면 됩니다.
# 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
|
위 샘플은 호스트의 /my/own/datadir디렉토리를 컨테이너의 /var/lib/mysql디렉토리로 마운트 하였습니다. 이제 데이터베이스 파일은 호스트의 /my/own/datadir디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않습니다. 최신버전의 MySQL 이미지를 다운받고 다시 컨테이너를 실행할 때 동일한 디렉토리를 마운트 한다면 그대로 데이터를 사용할 수 있습니다.
[ Docker Compose ]
지금까지 도커를 커맨드라인에서 명령어로 작업했습니다. 지금은 간단한 작업만 했기 때문에 명령이 길지 않지만 컨테이너 조합이 많아지고 여러가지 설정이 추가되면 명령어가 금방 복잡해집니다.
도커는 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 Docker Compose라는 툴을 제공합니다.
ㅇ Docker compose 설치
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
# test docker-compose version |
ㅇ wordpress 만들기
기존에 커맨드라인 명령어로 만들었던 wordpress를 compose를 이용해 만들어 보겠습니다.
먼저 빈 디렉토리를 하나 만들고 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: |
실행
docker-compose up |
'Linux > ubuntu' 카테고리의 다른 글
Flex 대신 jellyfin 을 운용해보자 (@docker) (0) | 2019.11.07 |
---|---|
Flex Media Server 설치 (@docker) (0) | 2019.11.07 |
ubuntu 시스템 정보 확인 (0) | 2019.11.07 |