티스토리 뷰
docker run 은 Image 로 Container 를 생성하는 명령어이다.
docker run <옵션> <이미지> <명령> <매개 변수>
| -i (interactive) | 컨테이너의 표준 입력(stdin)을 활성화. (주로 -it 함께 사용) |
| -t (tty) | tty(가상 터미널)을 할당. 리눅스에 키보드를 통해 표준 입력(stdin)을 전달할 수 있게한다. (주로 -it 함께 사용) |
| --name | 컨테이너 이름을 지정. |
| -d (detach) | 컨테이너를 백그라운드로 실행. |
| -p (publish) | 호스트와 컨테이너의 포트를 연결 (포트포워딩). -p <호스트 포트>:<컨테이너 포트> ex) -p 80:8888 - 호스트에 8888로 접속하면, 컨테이너 내부의 80포트로 자동 접속. |
| -v (volume) | 호스트와 컨테이너의 디렉토리 연결(마운트) -v <호스트 절대경로>:<컨테이너 절대경로> ex) -v /Users:/usr. - 컨테이너 /usr에 저장하는 파일은 호스트의 /Users 디렉토리에 저장. |
주로 쓰는 옵션만 정리해 보았다.
데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 워드프레스 기반 블로그 서비스를 만들어 보자.
docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
// mysql을 사용하여 database 컨테이너를 생성
docker run -d --name wordpress --link wordpressdb:mysql -p 80 wordpress
// 워드프레스 이미지를 이용해 워드프레스 웹 서버 컨테이너를 생성한다. -p 옵션 에서 80을 입력했으므로 호스트의 포트 중 하나와 컨테이너의 80번 포트가 연결된다.


이제 웹 브라우저로 [호스트 IP]:32768 에 접근 가능하다.
docker network ls
//도커에서 쓸 수 있는 네트워크를 확인
1)브리지 네트워크
docker network create --driver bridge mybridge
docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
//기본적으로 사용하는 docker0을 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 네트워크를 생성한 후, 컨테이너가 사용하도록 해 보자
docker network create --driver=bridge --subnet=172.72.0.0/16 --ip-range=172.72.0.0/24 --gateway=172.72.0.1 my_custom_network
//다음과 같은 커스텀 네트워크도 만들 수 있다.
2)호스트 네트워크
docker run -i -t --name network_host --net host ubuntu:14.04
//컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 바로 서비스 할 수 있다.
3)논 네트워크
docker run -i -t --name network_none --net none ubuntu:14.04
//네트워크를 사용하지 않는 컨테이너 생성
4)컨테이너 네트워크
--net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.
docker run -i -t -d --name network_container_1 ubuntu:14.04
docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:14.04
하면 network_container_2의 네트워크 세부사항이 network_container_1과 똑같다.
※ docker exec network_container_1 ifconfig
※ docker exec network_container_2 ifconfig
docker run -i -t -d --name net_lhs_con1 --net mybridge --net-alias lhs ubuntu:14.04
docker run -i -t -d --name net_lhs_con2 --net mybridge --net-alias lhs ubuntu:14.04
docker run -i -t -d --name net_lhs_con3 --net mybridge --net-alias lhs ubuntu:14.04
브리지 타입의 네트워크와 run 명령어의 —net-alias 옵션을 함께 쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있다.
docker run -i -t --name net_alias_ping --net mybridge ubuntu:14.04
root@?????????:/# ping –c 4 lhs
root@?????????:/# apt-get update
root@?????????:/# apt-get install dnsutils
root@?????????:/# dig lhs
컨테이너 3개의 IP로 각각(??) ping 이 전송된 것을 확인할 수 있다.

도커 이미지
특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 할 경우, 컨테이너 안 에서 작업한 내용을 이미지로 만들어보자
docker run -i -t --name commit_test ubuntu:14.04
echo test_first! >> first
docker commit -a "lhs0731" -m "my first commit" commit_test commit_test:first
//만든 컨테이너로 이미지로 만든다.
//-a 옵션은 author를 뜻하며, -m은 이미지에 포함될 부가 설명을 뜻한다.

docker commit -a "lhs0731" -m "my second commit" commit_test commit_test:second
//컨테이너에 apt-get update 후 이미지를 만들었다. 그러면 이미지의 용량도 달라진다.

※ 컨테이너가 사용 중인 이미지를 docker rmi -f로 강제로 삭제하면 이미지의 이름이 으로 변경되며, 이러한 이미지들을 댕글링(dangling) 이미지라고 한다. 댕글링 이미 지는 다음과 같이 별도로 확인할 수 있다.
# docker images -f dangling=true
이미지 추출
docker save -o ubuntu_14.04.tar ubuntu:14.04
docker save 명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 매타데이터를 포함해 하나의 파일로 추출할 수 있다.
docker load -i ubuntu_14.04.tar
추출된 이미지는 load 명령어로 모든 매타데이터와 함께 도커에 이미지로 로드할 수 있다.
export 명령어는 컨테이너의 파일시스템을 tar 파일로 추출하지만 Docker 이미지의 layer에 대한 설정 정보를 저장하지 않는다. 또한 import 명령어는 추출된 파일을 이미지로 다시 저장한다.
docker export -o rootFS.tar mycontainer
docker import rootFS.tar myimage:0.0
export 한 이미지를 다시 import하여 이미지를 생성 후 컨테이너를 생성하려고 하면 다음과 같이 오류가 발생한다.
docker run -i -t -p 80:80 --name owncloud ubuntu_own:20.04
--> docker: Error response from daemon: No command specified. See 'docker run --help’
여기서 살펴볼 점은 바로 도커 export로 추출하여 로드한 docker image의 경우 docker container를 단순히 아카이빙 한 이미지 라는 것이다. 즉 압축한 파일 자체를 이미지로 로드 해 둔 것이라고 볼 수 있다. 이를 정상적으로 기동하기 위해서는 import 이미지를 기반으로 새롭게 Dockerfile을 작성하거나, import 시점에 명령어를 주입시켜 주어야 한다.
이미지 배포
docker run -it --name commit_container1 ubuntu:14.04
먼저 컨테이너를 생성한다.
docker commit commit_container1 rep_0522:0.0
생성한 컨테이너 commit_container1의 이미지를 rep_0522 repository에 업로드 하려 커밋
docker tag rep_0522:0.0 lhs0731/rep_0522:0.0
태그 생성
docker login
도커에 로그인후
docker push lhs0731/rep_0522:0.0
푸쉬

'클라우드,가상화,방화벽' 카테고리의 다른 글
| ASA방화벽-1 (0) | 2023.05.24 |
|---|---|
| [docker]도커 스웜(swarm) (1) | 2023.05.22 |
| [docker]도커 파일 (0) | 2023.05.22 |
| AWS-EC2 서버, Route53(DNS), elasticIP, 도메인 연결 (0) | 2023.05.09 |
| 도커(Docker)기본 개념과 owncloud 실습 (0) | 2023.05.08 |