Docker
현실에서 Container가 만들어지면서 물류 혁명이 일어났다.
컨테이너들은 규격화돼있어서 배로 실을때 기계가 자동으로 실어줄 수 있다.
하적할 때도 컨테이너의 규격이 일정하기때문에 자동이 가능하다.
언제 어떤 물건을 넣어도 규격화가 돼있는 상태는 매우 이상적이고 편리하다.
컨테이너끼리는 완전히 시스템 리소스가 다 분리되어있다.
한 컨테이너는 다른 컨테이너에게 영향을 주지 않는다.
이쪽 httpd 컨테이너에서 80번을 쓰고, 저쪽 nginx 컨테이너에서 80번을 똑같이 쓰더라도 충돌날 일 없다.
- 경량 : 하나의 Host에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행
- 고속 : 새로운 컨테이너를 1초 이내로 생성
- 실행 중 변경 : 실행중인 컨테이너에 접속, 명령어 입력, 패키지 설치, 사용자 추가, 프로세스 백그라운드 실행, 내 외부 디렉토리 연결 가능
Q. 클라우드 쪽에서 흔히 나오는 면접 질문
컨테이너와 가상머신의 차이점은 무엇일까요?
둘 다 바이너리와 라이브러리가 런타임을 지원해 주고, 그 위에 서비스(에플리케이션)을 올리는 환경
컨테이너는 Guset OS와 하이퍼바이저 부분을 하나로 줄인 경량화된 가상머신이다.
즉, 가상머신은 OS의 가상화까지 포함되는 개념이였다면, 컨테이너는 프로세스를 격리시킨다는 개념이다.
(라이브러리는 데몬 등의 서비스가 실행되는 함수 등이 담겨있는 곳이고
바이너리에는 명령어가 담겨있는 것이라고 생각하면 된다.)
https://www.alibabacloud.com/ko/knowledge/difference-between-container-and-virtual-machine
용량을 줄이는 방법으로는 레이어 방식을 쓴다.
<< 기본 명령어 >>
기본적으로 docker 하고 엔터 치면 관련 옵션과 명령어를 볼 수 있다.
- yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo -y
- 도커 커뮤니티 에디션.repo 다운로드
- yum install -y docker-ce docker-ce-cli containerd-io
- docker 패키지 다운로드
- docker pull httpd
- httpd 이미지 다운로드
- docker images
- 이미지 조회
- docker run -itd -p 60080:80 --name w1 httpd
- httpd를 백그라운드 포그라운드 상관없이 실제 PC의 60080번을 해당 Docker에 80번 포트를 통해 실행
- docker ps -a
- 모든 프로세스 출력
- docker rm -f [name]
- 실행 중이든 실행 중이지 않든 해당 프로세스 삭제
- systemctl start docker
- 도커 실행
- systemctl enable docker
- 도커 부팅시 자동 실행
<< Docker 설치 >>
기본적인 리눅스의 네트워킹 작업 (vi /etc/sysconfig/network-scripts/ifcfg-ens33)
selinux 끄기 작업 (vi /etc/sysconfig/selinux)
을 완료한 뒤 도커 전용 머신을 하나 생성하자.
리포지토리를 받은 뒤에
# yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo -y
도커 패키지를 다운받는다.
# yum install -y docker-ce docker-ce-cli containerd-io
<< image 다운/삭제>>
image 다운
centos 7을 다운 받아보자.
# docker pull centos:7
centos7의 이미지가 왜 이렇게 작나? 그것이 docker의 특징이다.
아래와 같이 받은 이미지를 확인할 수 있다.
# docker images
image 제거
명령어에서 태그를 안 붙이면 아래 앞부분과 같이 이미지를 인식 못한다.
: 뒤에 붙는 태그 부분을 설정하지 않으면 도커는 무조건 최신버전을 의미한다.
다른 버전을 실행하고 싶다면 꼭 태그를 붙여준다.
# docker rmi centos:7
<< Container 실행 >>
이제 이미지를 바탕으로 컨테이너를 실행한다. 이미지는 데몬을 실행하는 이미지와 쉘을 실행하는 이미지가 있다.
Deamon (httpd, vsftpd, mail, dhcpd) 으로 접속하는 service들은 -d 옵션을 넣어야 한다.
-it 옵션은 Shell 로 접속하는 service에 붙이는 옵션이다.
구분이 안 가서 잘 모르겠으면 -itd 로 모든 옵션을 다 넣어줘보자.
단, -itd 로 실행하면 무조건 컨테이너 실행은 되지만 진입은 따로 해야 한다.
이렇게 Container가 Service를 실행하는 앤지, Shell을 실행하는 앤지 구분을 해야 명령어가 다르다.
Container | 옵션 | -itd | 외부 이동 |
Service | -d | exec -it 컨테이너이름 /bin/bash | exit |
Shell | -it | attach | Ctrl+p+q |
비정상 실행
centos:7 이미지는 쉘로 실행 되기 때문에 -it 옵션이 없으면 다음과 같이 컨테이너 실행 실패한다.
# docker ps 로 실행상태 확인 -> Exited (닫힌 상태이다)
잘못 실행됐기 때문에 삭제하는 것이 맞다.
# docker rm [닉네임 또는 컨테이너ID]
만약 실행중인 프로세스를 삭제할 때는 -f 옵션을 쓴다.
정상 실행
centos:7의 정상 실행 옵션은 아래와 같이 -it 로 실행시키는 방법이다.
반대로 httpd의 정상 실행 옵션은 -d이다.
만약 httpd를 -it 옵션으로 실행 했다면 httpd가 명령어를 안먹었을 것이다.
바로 실행시키고자 하면 run을, 컨테이너를 생성만 하자면 create를 쓰면 된다.
# docker create -d --name w1 httpd
닉네임으로 생성하는 옵션
# docker run -it --name [닉네임] centos:7
포트 포워딩(port forwarding)을 해서 생성하는 옵션
# docker run -itd -p 60080:80 --name [닉네임] httpd
실행 확인
실행중이지 않은 컨테이너도 보여주는 옵션.
이제 막 create로 만든 컨테이너는 start 해주기 전까지 creates 상태에 있으므로 여기서 검색된다.
# docker ps -a
해당 컨테이너를 시작하면 상태가 변하며 실행중인 컨테이너만 보여주는 ps에도 검색된다.
# docker start w1
# docker ps
컨테이너 전체를 ID만 출력
# docker ps -aq
<< Container 접속 >>
Container | 옵션 | -itd | 외부 이동 |
Service | -d | exec -it 컨테이너이름 /bin/bash | exit |
Shell | -it | attach | Ctrl+p+q |
작동 시작/중지
# docker pause [이름]
실행중인 이미지를 pause 하면 다음과 같이 status 항목에 (paused) 표시로 변하지만
docker ps에서 내려오진 않는다. 그런 점에서 stop과 차이가 난다.
이때 docker inspect a1 해서 비교해서 보면, ip를 포함한 컨테이너의 정보를 모두 그대로 갖고 있는 상태다.
# docker unpause [이름]
반면에 Stop은 자기가 갖고 있는 모든 자원을 반납한다. (그래서 반납에 시간이 걸린다.)
Pause 는 멈추는 데 시간이 걸리지 않는 것과 차이가 있다.
# docker stop [이름]
docker inspect a1 로 보면 본인이 갖고 있는 자원 정보들이 모두 사라진 것을 확인할 수 있다.
# docker start [이름]
컨테이너 접속 (attach)
centos:7 이미지의 경우엔 해당 컨테이너 안에 접속할 때 attach를 쓴다.
이미지를 다운 받았는데 어떤 접속 방법을 쓸 지 모르겠다면 아래와 같다.
docker ps
command > bin/sh = shell로 실행되는 애들은 attach로 내부 접근 해줘야 한다.
# docker attach [이름]
다음과 같이 앞머리가 실행중인 컨테이너 ID 명으로 바뀐다. (hash값이다)
( # docker inspect [이름] 으로 확인된 첫줄의 ID 값의 앞부분 15자를 따온 것이다.)
리눅스로 다시 나가고 싶지만 컨테이너는 실행상태로 냅두고 싶을 때 ctrl+p+q
(exit로 나가게 되면 쉘 밖으로 나가는 것이라 exited 상태가 돼버리고, rm으로 삭제 후 다시실행해야 한다.)
ctrl+p+q로 나갔을 땐 아래와 같이 아직 실행중인걸 볼 수 있다.
컨테이너 접속 (exec~)
httpd 이미지의 경우에는 다르게 접속해야 한다.
이미지를 다운 받았는데 어떤 접속 방법을 쓸 지 모르겠다면 아래와 같다.
docker ps
command > 서비스명 (포그라운드/백그라운드)로 실행되는 애들은 exec로 내부 접근 해줘야 한다.
vi 편집기 등을 쓰려면 bash 쉘로 접속해야 하니까 이렇게 해보자.
# docker exec -it [컨테이너이름] /bin/bash
접속하지 않고 내부 명령어 실행
굳이 접속해서 대화형 창 등을 띄우지 않아도
바깥의 리눅스에서 컨테이너에게 내부에서 명령을 실행하도록 시킬 수 있다.
( 단, 컨테이너 내부에도, 리눅스에도 동시에 해당 명령어가 존재해야지 실행시킬 수 있다.)
h1 프로세스에게 ip 정보를 내놓으라고 명령해보자.
# docker exec -it h1 ip a
<< Container 정보 >>
# docker inspect [이름]
해당 프로세스가 갖고 있는 계층적 구조, 컨테이너 id (해시값), shell, 네트워크 정보 등 자세한 정보들이 출력된다.
리눅스 ip <ㅡ> 컨테이너 ip
내부/외부 네트워크가 매핑 되어 서로 연결되어 있다.
# ip a
# docker exec a1 ip a
기존 Container로 새 image 만들기
# docker commit [리포지토리] [태그]
예시 : docker commit c1 shr/test:centos7
(주의: 뒤에 리포지토리랑 태그같은거 안 입력하면 <none>으로 나오니까 입력해주자.)
도커 컨테이너를 실행하여
docker run -it --name c1 anaryeoni/test:centos7
mkdir /test
echo ‘hello’ > /test/test.txt
ctrl + p + q로 빠져나오기
컨테이너를 가지고 새로운 이미지 생성
# docker commit c1
image를 수정하여 저장했던 image를 다시 실행하여 수정된 게 반영 되었는지 확인한다.
아까 test 디렉터리 추가+ test text 파일 만들어서 커밋했던 대로 이미지가 저장되어 컨테이너화 된 것이 보인다.
이미지 태그 변경
# docker tag centos:7 shr/test:centos7
컨테이너 이름 변경
# docker rename c1 httpd
컨테이너의 수정사항 목록
# docker diff [컨테이너 이름]
아랫쪽 보면 /usr/local/apache2/htdocs 를 수정하니까 그 상위에 있는 모든 디렉토리도 수정이 된걸로 뜬다.
초기화
프로세스를 전부 지우는 명령어.
# docker rm -f $(docker ps -a)
이미지 삭제
# docker rmi [이미지ID]
'Docker' 카테고리의 다른 글
다른 container로 image 옮기기 (export, import, 환경변수) (0) | 2022.12.08 |
---|---|
HAProxy - WEB 연습 (0) | 2022.12.08 |
Docker nginx-WEB (0) | 2022.12.08 |
Docker httpd-WEB (0) | 2022.12.01 |
Docker Hub (0) | 2022.11.30 |