출처: 시작하세요! 도커/쿠버네티스 (용찬호 저)
http://www.yes24.com/Product/Goods/84927385
docker run -i -t ubuntu:14.04
docker create -i -t --name brocentos centos:7
docker [ start/attach ] brocentos
docker start [ docker id ]
docker ps
docker rename brocentos brocontainer
docker rm [ -f ] brocontainer
docker stop brocontainer
docker container prune
docker ps -a -q
docker stop $(docker ps -a -q)
모든 컨테이너 정지기본적으로 컨테이너는 172.17.0.x의 IP를 순차적으로 할당
아무 설정이 되어있지 않다면 컨테이너는 외부에서 접근할 수 없으며 호스트에서만 접근 가능하다.
따라서 컨테이너의 애플리케이션을 노출하려면 eth0의 IP와 Port를 호스트의 IP와 Port에 바인딩해야함.
ifconfig
: 컨테이너 네트워크 인터페이스 확인
docker run -i -t --name brocontainer -p 80:80 ubuntu:14.04
apt-get update && apt-get install -y apache2
service apache2 start
-i -t
: attach 가능한 상태로 설정-d
: detached 옵션, 컨테이너를 백그라운드에서 동작하는 어플리케이션으로써 실행하도록 만듬-d
옵션이 있는 상태에서는 반드시 프로그램이 실행되어야 하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료된다. dockerfile을 작성해서 실행할 프로그램을 미리 넣어주고 bash에서 확인하지 않고 백그라운드 환경에서 돌릴 수 있는 옵션인 것 같다.
터미널을 차지하지 않는다 ➡️ 터미널에서 볼 수 없다. 알아서 뒤에서 돈다 는 느낌?
-e
: 환경변수 설정docker run -i -t --name mysql_attach \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
컨테이너의 MYSQL_ROOT_PASSWORD 환경변수의 값을 password로 설정한다는 의미
❗️ 비밀번호처럼 민감한 정보를 컨테이너 내부의 환경 변수로 설정하는 것은 바람직하지 않음.
❗️ 이런 경우에는 도커 스웜 모드의 secret이나 쿠버네티스의 secret과 같은 기능을 활용해서 비밀번호를 전달하는 게 좋음.
exec
: 컨테이너 내부의 shell 사용 가능하게 하는 명령어docker exec -i -t wordpressdb /bin/bash
exec : 내부에서 명령어를 실행한 뒤 결괏값 반환받을 수 있게 해준다. '-i -t' 옵션 없이 exec만 쓰면 결과만 반환한다.
--link
: 내부 IP를 알 필요 없이 항상 컨테이너에 alias로 접근하게 설정해줌.--link
를 사용.--link wordpressdb:mysql
워드프레스 웹 서버 컨테이너는 wordpressdb의 IP를 몰라도 mysql이라는 호스트명으로 접근할 수 있게 됨.
그러나 이 옵션은 --link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않으면 적용한 컨테이너 또한 실행할 수 없음. 따라서 컨테이너를 연결해주는 것 뿐만 아니라 컨테이너 실행 순서의 의존성도 정의해 줌.
도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용임
ㄷ그리고 그 위에 쓰기가 가능한 도커 컨테이너를 올리는 형식을 띰.
이 방식에는 단점이 있는데, 도커 이미지(mySQL Container)를 삭제하면 도커 컨테이너 계층에 저장되어 있던 데이터베이스의 정보도 삭제된다는 것
따라서 이를 위해 데이터를 영속적으로 저장하는 방법이 몇가지 있음.
볼륨을 활용하는 방법
1. 호스트와 볼륨 공유
2. 볼륨 컨테이너 활용
3. 도커가 관리하는 볼륨 생성
-v [호스트 경로] : [컨테이너 경로]
: 호스트 경로와 컨테이너의 경로 내의 디렉토리를 공유하겠다는 뜻-v
를 여러개 쓸 수 있음. 이거는 그냥 -v
로 볼륨을 공유하고 있는 컨테이너에 다른 컨테이너를 연결시켜서, 로컬과 볼륨을 공유하고 있는 컨테이너에 저장하는 거...
이러한 구조를 활용하면 호스트에서 볼륨만 공유하고 별도의 역할을 담당하지 않는 '볼륨 컨테이너'로서 활용하는 게 가능.
--volumes-from [컨테이너 명]
: [컨테이너 명]과 볼륨을 공유하겠다는 것.도커 자체에서 제공하는 볼륨을 사용할 수도 있다.
docker volume create [--name bro]
docker volume ls
볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류의 스토리지 백엔드를 쓸 수 있음.
기본적으로는 local : 로컬 호스트에 저장되며, 도커 엔진에 의해 생성되고 삭제된다.
docker run ~ -v [볼륨 이름] : [컨테이너 내의 공유 디렉토리]
데비안 운영체제에서 apt-get 을 실행하면 apt 레포에서 패키지를 내려받고 레드햇 운영체제에서 yum을 실행하면 yum 레포에서 패키지를 내려받듯이 도커는 도커 허브에서 이미지를 가져옴.
docker search [ubuntu]
: Github처럼 STAR도 있고, 다양한 이미지 확인 가능보통 이미지 생성 시 ubuntu 등 os를 들고와서 그 위에 이미지를 생성하는 듯?
docker commit [컨테이너명] [레포지토리:태그]
docker commit commit_test commit_test:first
태그는 입력하지 않으면 자동으로 latest로 저장됨.
옵션
-a
: author-m
: commit message이미지를 단일 바이너리 파일로 저장하는 법
docker save [-o 추출될 파일명] [추출할 이미지]
: 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출docker sav -o ubuntu14.tar ubuntu:14.04
docker load -i ubuntu14.tar
: 추출된 이미지를 다시 도커에 로드↔️ export
import
와의 차이점?
commit
으로 이미지를 만들면 변경된 사항뿐만 아니라 컨테이너가 생성될 때 설정된 detached 모드, 컨테이너 커맨드와 같은 설정도 이미지에 함께 저장됨.
그러나 export
는 컨테이너의 파일시스템을 tar파일로 추출하며, 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않음.
export
는 레이어 구조를 사용하지 않으므로 비효율적이다.
두가지 방법이 있다.
도커 허브 이미지 저장소를 이용하는 방법과 사설 레지스트리를 사용하는 방법.
결제를 하지 않으면 Private 저장소의 수에 제한이 있지만, Public은 언제든 사용 가능
docker commit [컨테이너명] [사용자 이름]/[이미지 이름]:[태그]
: 이미지 도커 허브에 올리기[사용자 이름]/[이미지 이름]:[태그]
까지가 모두 이미지 이름이 됨.docker commit bro_contatiner jee161209/my-image:latest
docker tag [기존의 이미지 이름] [바꿀 이미지 이름]
: 이미지 이름 바꾸기
docker pull [이미지 이름]
: 이미지 pull
docker pull jee161209/my-image:latest
사용자가 직접 이미지 저장소를 만듬. 그러나 서버, 저장 공간 등을 직접 관리해야 한다.
docker run -d --name my-registry \
-p 5000:5000 --restart=always registry:2.6
레지스트리 컨테이너는 기본적으로 5000번 포트 사용
이 포트로 컨테이너의 RESTful API를 이용할 수 있음.
curl localhost5000/v2/
: 컨테이너가 정상적으로 작동하는지 확인
docker push [도메인 이름]:5000/[이미지 이름]:[태그]
: 이미지 push
DOCKER_OPTS=--insecure-registry=[입력]
를 docker daemon에 추가해서 HTTPS를 사용하지 않는 레지스트리 컨테이너에 이미지를 push할 수 있음. Docker daemon의 시작 옵션을 변경하는 방법?
1. 도커 데몬 서비스의 시작 옵션을 직접 변경
2. daemon.json을 설정해서 docker daemon이 설정 파일을 읽게 만드는 것.
- 2번의 경우(for Mac) 도커 트레이 아이콘에서 [Preferences]를 클릭하고 [Deamon] ➡️ [Advanced] ➡️ 도커 옵션 입력 ➡️ [Apply & Restart]
docker pull [도메인 이름]:5000/[이미지 이름]:[태그]
: docker pull