2023-10-15
1. 컨테이너와 가상화
1.1) 가상화
- Virtual Machine 이라고 부르는 하드웨어 가상화를 이용해서 프로세스를 격리
- Virtual Box 나 VMWare 같은 가상화 기술은 가상의 물리 서버를 만드는 것으로 애플리케이션을 독립된 가상머신 이미지에 배치함으로써 완벽하게 격리된 환경에서 실행
- 물리적인 대상을 소프트웨어로 대체한 개념으로 운영체제도 아무것이나 설치할 수 있고 그 위에 어떤 소프트웨어를 설치해도 상관없음
- 물리적인 컴퓨터(서버) > HOST OS > Hypervisor > GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
.....
- 각 앱은 분리된 GuestOS 이미지에서 실행
- 이미지 실행은 Hypervisor 가 수행
- Vagrant 가 대표적인 도구로 개발 및 테스트 환경에 적합
- 단점
- 낮은 성능
- 높은 자원 소비
- 파일 크기가 큼
- 전 가상화라고 부르던 방식이였음
1.2) 반 가상화
- 하드웨어를 완전히 가상화하지 않는 방식
- 하드웨어가 Hypervisor 에게 직접 명령을 전달하는 방
- 물리적인 컴퓨터(서버) > Hypervisor > GuestOS > 바이너리/라이브러리 > 앱 GuestOS > 바이너리/라이브러리 > 앱 GuestOS > 바이너리/라이브러리 > 앱
- Guest OS 의 커널을 수정해야하기 때문에 Open Source OS가 아니면 사용하기 어려움
- Xen 이 대표적인 방식
1.3) 컨테이너 가상화
- Host OS 위에 컨테이너 관리 소프트웨어를 설치해서 논리적으로 컨테이너를 나누어서 사용하는 방식
- 물리적인 컴퓨터(서버) > HOST OS > 컨테이너 관리 소프트웨어 > 미들웨어 > 애플리케이션
미들웨어 > 애플리케이션
미들웨어 > 애플리케이션
- 장점 : 오버헤드가 적어서 가볍고 속도가 빠름
- 단점 : 다양한 OS를 사용할 수 없고 보안적으로는 완전한 격리가 아님
- 운영체제 자체를 공부하고자 할 때는 아직도 전 가상화를 이용
- 이러한 컨테이너 관리 소프트웨어로 가장 많이 사용되던 것이 Docker
- Host OS의 프로세스 수준에서 격리
- 각 커테이너는 별도의 라이브러리를 가지기 때문에 다른 컨테이너의 업데이트가 영향을 미치지 않음
2. Docker
2.1) 개요
- Container 형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령행 도구로 구성되는 애플리케이션
- 프로그램과 데이터를 다른 프로그램과 데이터와 격리시키는 기능을 제공하는 애플리케이션 - 컨테이너 가상화
- 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 Docker
2.2) 특징
- Microservice 전환 및 DevOps, Testing 등 다양한 분야에서 활용
- 리눅스 컨테이너 구현체의 사실 상의 표준(de-facto)
2.3) Docker는 리눅스를 사용
- Docker는 리눅스 기반에서만 사용 가능
- Windows 나 Mac OS 에서도 Docker를 구동시킬 수 있으나, 이 경우 내부적으로 리눅스가 사용되며 컨테이너에서 동작시킬 프로그램도 리눅스 용 프로그램
- Windows 에서 사용할 때는 리눅스 커널을 설치해야 합니다.
- 사용하는 리눅스의 기술
- chroot(change root): 특정 디렉터리를 최상위 디렉터리 root로 인식하게끔 설정하는 리눅스 명령
-
namespace: 프로세스 자원을 관리하는 기능으로, mnt, pid, net, ipc, user 등의 자원을 그룹화하여 할당하는 기능
-
cgroup(control group): CPU, 메모리, 디스크 I/O, 네트워크 등의 자원 사용량 제어를 통해 특정 애플리케이션의 과도한 자원 사용을 제한하는 기능
2.4) Docker Hub, Image, Container
- Image
- Docker에서 사용하는 애플리케이션의 개념
- 컨테이너를 만들어내는 설계도 역할을 수행
- 하나만 있으면 여러 개의 컨테이너를 생성할 수 있음
- 컨테이너로부터 이미지를 생성하는 것도 가능
- 종류
- 운영체제와 유사한 형태 : 실제 운영체제를 학습하는 용도로는 사용하기가 어려움
- 하나의 소프트웨어를 포함한 이미지 : 파이썬, GO, C, Java 등을 포함한 이미지
- 소프트웨어 여러 개를 포함한 이미지 : 운영체제, 프로그래밍 언어, 데이터베이스 등을 복합적으로 하나로 묶어서 사용하는 경우 - 개발 환경을 설정하거나 애플리케이션을 배포할 때 사용
- Docker Hub
- 이미지 들을 배포하고 자유롭게 다운로드 할 수 있는 웹 저장소
- Container
- 이미지를 이용해서 실행되는 프로세스의 개념
- 일반적으로는 하나의 컨테이너에 하나의 프로그램만 사용하는 것을 권장하지만 애플리케이션을 배포할 때는 이 원칙을 지키지 않는 경우도 있습니다.
- Dokcer 컨테이너는 쓰고 버리는 일회용품
- 컨테이너에 저장한 데이터는 원칙적으로 컨테이너가 폐기되면 소멸됨
- 컨테이너에 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능
2.5) 성질
- 환경을 격리
- 독립된 환경
- 여러 개의 애플리케이션을 실행할 수 있음
- 동일한 애플리케이션을 여러 개 실행할 수 있음
- 이미지를 만들 수 있음
- 이동이 편리
- 동일한 컨테이너를 쉽게 만들 수 있음
- 환경 이동이 쉬움
- 개발 환경을 배포하기가 쉬움
- 도커 레지스트리
- 이미지를 내려받는게 수월 - 이미지를 직접 만들지 않아도 됨
- 교체하기 수월 - 업데이트가 쉽고 소프트웨어 교체가 수월
- 커널이 없음 : 운영체제를 직접 설치하지 않음
- 가벼움
- 배포판을 바꾸는게 수월
- 운영체제의 동작을 완전히 재현하지는 못하기 때문에 운영체제를 세밀하게 조작하는 작업에는 맞지 않고 리눅스 환경에서만 사용이 가능
- 독립된 환경
2.6) 주 용도
- PaaS 서비스를 가능하게 하는 소프트웨어 개발 환경을 제공
IaaS(AWS, GCE, Azure, OCI, NHN, Open Stack 등) : 오케스트레이션 도구(Kubenetes, 도커 스웜 등) - LXC/Docker 기술 - 컨테이너로 구동되는 애플리케이션
2.7) 구성 요소
- Docker Engine : Docker를 이용한 애플리케이션 실행 환경 제공을 위한 핵심 요소
- Docker Hub : 컨테이너 이미지를 공유하는 클라우드 서비스
- Docker-Compose : 의존성있는 독립된 컨테이너에 대한 구성 정보를 yaml 코드로 작성하여 일원화된 애플리케이션 관리를 가능하게 하는 도구로 Dockerfile 도 있음
- Docker Registry : Docker 컨테이너 이미지를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구
- Docker Machine : Docker 실행 환경을 생성하기 위한 도구
- Docker Swarm : 여러 Docker 호스트를 클러스터로 구축하여 관리할 수 있는 도커 오케스트레이션 도구로 쿠버네티스도 여기 포함됨.
2.8) Docker Engine 설치
- Docker Hub 사이트에서 회원 가입
- Windows
- 리눅스 커널을 다운로드 받아서 설치한 후 수행
- wsl --install
- wsl --set-default-version 2
- Docker Desktop을 다운로드 받아서 설치
- 리눅스 커널을 다운로드 받아서 설치한 후 수행
3. 기본 명령어
3.1) 이미지 다운로드
- docker pull hello-world
- 이미지 이름이 틀리지 않아서 다른 운영체제에서는 다운로드가 되는데 Mac M1 이상의 프로세서에서 안되는 경우는 --platfrom linux/amd64 를 추가해주면 됩니다.
- 다운로드 받지 못하는 경우 저 메시지가 출력됩니다.
C:\Users\USER>docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:4f53e2564790c8e7856ec08e384732aa38dc43c52f02952483e3f003afbf23db
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview hello-world
C:\Users\USER>
다운로드 완료!
3.2)이미지 확인
- docker images
- docker desktop을 설치한 경우는 images 탭에서 확인이 가능
3.3) 컨테이너 생성
- docker run hello-world
C:\Users\USER>docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
C:\Users\USER>
3.4) 컨테이너 확인
- docker ps -a
- docker desktop을 설치한 경우는 containers 탭에서 확인이 가능
3.5) 도커 버전 확인
- docker version
- docker는 client 와 server로 구성
- client는 사용자로부터 도커 명령을 받고 결과를 출력하는 역할을 수행
- 도커 명령을 수행하는 명령줄(Command Line)을 제공
- 명령을 도커 데몬에게 전달하고 도커 데몬이 수행한 결과를 출력
- server는 도커 엔진(도커 데몬)을 이용해서 컨테이너를 시작하고 운영하고 정지 등을 수행
3.6) 도커 구성 정보 확인
- docker info
- 커널 정보, 현재 컨테이너 수 등의 정보가 출력
3.7) 디스크 사용량 확인
- docker system df
3.8) 도커 관련 이벤트 정보를 표시
- docker system events
- 롤링 로그이며 한 번에 최대 1000개의 이벤트를 보유
- 하나의 터미널에서 docker system events 명령을 수행
- 다른 터미널에서 docker run -dit -p 80:80 --name=webapp nginx 명령을 수행
- 이전 터미널에 이미지 다운로드 및 컨테이너를 생성했다는 로그가 기록됨
- filter 옵션 사용 가능
- type, event, container 등의 옵션 사용 가능
- docker system events --filter 'type=image' : 이미지 관련된 로그만 출력됨
- docker system events --filter 'event=stop' : stop 관련된 이벤트 로그만 출력됨
- docker system events --filter 'container=wepapp' : wepapp 이라는 컨테이너의 이벤트 로그만 출력됨
- 시간 설정 가능
- docker system events --since 12h : 12시간 전 부터의 로그
- 로그를 JSON 형식으로 출력
- docker system events --format '{{json .}}'
- 로그를 출력하는 경우는 모니터링을 위해서인데 일반적으로 PaaS 서비스에서 도커를 제공하는 경우 어떤 명령들을 수행했는지 확인하기 위한 용도로 사용
4. Docker Hub
4.1) Docker Registry
- Image 를 배포하는 장소를 Docker Registry 라고 합니다.
- Docker Hub 는 Docker 제작사의 공식 도커 레지스트리 입니다.
5. Containter Service
5.1) 도커 컨테이너를 이용하는 애플리케이션 서비스 개발 과정
- 애플리케이션 코드 개발 -> 기본 이미지를 이용한 Dockerfile 작성 -> Dockerfile 빌드를 통한 새로운 이미지를 생성 -> 생성된 이미지를 이용해서 컨테이너 실행 (도커 컴포즈를 이용한 다중 컨테이너 실행 -> Micro Service 테스트) -> 컨테이너 애플리케이션 서비스 테스트 -> 로컬 및 원격 저장소에 이미지를 저장 -> Git Hub 등을 활용한 Docker file 관리 -> 동일 환경에서의 지속적 애플리케이션 개발 수행
Docker file : 하나의 컨테이너를 생성하기 위한 설정
Docker compose : 2개 이상의 컨테이너를 생성하기 위한 설정
Docker Swarm : 여러 개의 컨테이너(동일한 모양 컨테이너) 관리
5.2) IaC (Infrastructure as Code)
- 컨테이너 동작에 필요한 모든 내용을 사전에 코드로 작성해서 Ansible, (Chef, Puppet), Vagrant 와 같은 Infra Provisioning 도구로 자동화하게 되면 필요할 때 마다 애플리케이션 및 서버 환경을 적은 비용으로 빠르게 개발하고 배포하고 확장할 수 있는데 이것을 IaC라고 함.
5.3) Docker Container 관련 명령
- 명령어는 무조건 docker로 시작
- 명령어는 상위 커맨드와 하위 커맨드로 분류하는데 상위 커맨드는 생략 가능
- 상위 커맨드
- container : 컨테이너 관련 명령 - 생략 가능
- start(실행), stop(정지), create(생성), run(이미지 다운로드 및 생성과 실행), rm(삭제), exec(컨테이너 안에서 프로그램을 실행), ls(목록 출력), cp(컨테이너와 호스트 간에 파일을 복사), commit(컨테이너를 이미지로 만들기)
- image : 이미지 관련 명령 - 생략 가능
- pull (다운로드) , rm(삭제), ls(목록 출력), build(이미지 생성)
- volume : 데이터를 저장하기 위한 명령
- create(생성), inspect(상세 정보를 출력) , ls, prune(마운트 되지 않은 볼륨을 삭제), rm
- network : 여러 개의 애플리케이션을 하나로 묶기 위한 명령
- connect(컨테이너 연결), disconnect, create, inspect, ls, prune, rm
- container : 컨테이너 관련 명령 - 생략 가능
- 상위 커맨드 없이 사용하는 커맨드
- checkpoint : 현재 상태를 일시적으로 저장하는 기능
- node : 도커 스웜의 노드를 관리하는 기능
- plugin : 플러그인 관리하능 기능
- secret : 비밀값 정보를 관리
- service : 도커 스웜의 서비스를 관리하는 기능
- stack : 여러 개의 도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리
- swarm : 도커 스웜 관리
- system : 도커 엔진의 정보를 확인
- login
- logout
- search : 도커 레지스트리 검색
- version
- 프로그램 실행 도중에는 변경되지 않지만 환경이 변경되는 경우 수정해야 하는 문자열이나 숫자가 있으면 이런 코드는 하드 코딩하지말고 별도의 설정 파일을 만들어서 설정 파일에서 읽어오는 방식을 취하는 것이 좋습니다.
5.4) Image 관련 명령
- docker search [--limit 개수] 이미지 이름
- 이미지 조회
- 이미지는 starts 순으로 조회
- 이미지 다운로드
- docker image pull [옵션] 이미지이름[:TAG | @IMAGE_DIGEST]
- pull 명령은 image에만 존재하는 명령이므로 image를 생략해도 됩니다.
- 이미지 이름 뒤에는 TAG 가 사용되는데 가장 마지막 버전에는 latest 라는 태그가 자동으로 부여됩니다.
- TAG를 생략하면 latest 태그가 붙은 버전을 의미
- IMAGE_DIGEST 는 거의 사용하지 않는데 이 값은 Docker Hub 내에서 구분하기 위해서 만든 해시 값입니다.
- 옵션 : 옵션이 한 글자 인 경우는 - 이고 여러 글자인 경우는 -- 가 앞에 붙습니다.
- 파라미터를 옵션에 대입할 때는 = 을 이용합니다. (--platform=linux/amd64)
- 파라미터가 없는 한 글자 옵션은 여러 개를 하나로 묶어서 하는 것이 가능합니다. (-i -t -d : -dti 나 -dit 로 작성 가능)
- -a, --all-tags : 저장소에 태그로 지정된 여러 Image를 한 꺼번에 다운로드
- --disable-content-trust : 이미지 검증 작업을 수행하지 않습니다.
- --platform=플랫폼 : 플랫폼에 해당하는 이미지를 가져옵니다.
- -q, --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력을 숨김
- 별도의 옵션없이 jenkins/jenkins:lts 다운로드 - 확인은 dockerdesktop 에서 images 탭이나 docker images
- 별도의 옵션없이 debian 다운로드 - 확인은 dockerdesktop 에서 images 탭이나 docker images
- 도커 이미지 확인 : docker images(docker image ls)
- docker image ls 는 image를 생략해서는 안됨
- Image ID는 원래 64글자 이지만 앞에서부터 12글자만 출력한 것임
- 이미지 세부 정보 확인 : docker image inspect 이미지 이름
- 이미지의 레이어 정보 확인 : docker image histroy 이미지 이름
- 하나의 명령어가 아니고 여러 개의 명령어로 구성된 경우가 많은데 하나의 명령어를 레이어라고 합니다.
- docker pull httpd
- docker image history httpd
- 나오는 정보 중에서 사이즈를 가진 것만 레이어라고 하기도 함
- 이러한 레이어와 CMD, EXPOSE, ENV, WORKDIR 등의 명령어가 조합이 되서 하나의 이미지를 생성
- 하나의 명령어가 아니고 여러 개의 명령어로 구성된 경우가 많은데 하나의 명령어를 레이어라고 합니다.
5.5) 이미지를 도커 허브에 업로드
- 로그인 관련 명령
- docker login 과 docker logout
- 이미지 이름과 태그
- docker 의 태그는 레지스트리에 업로드를 할 때 사용하는 이름
- 태그를 만들 때는 레지스트리의 주소와 버전 표기를 추가해서 정식 명칭으로 생성
- adamsoft.com/adam:13 의 형태를 권장
- 이름 부여 : docker tag 태그
- 업로드 : docker push 태그
#httpd:latest 에 myhttpd:lts 라는 태그를 부여
docker image tag httpd:latest myhttpd:lts
#svng 이라는 계정에 myhttpd:lts를 업로드
docker push svng/myhttpd:lts
동일한 이름이 존재하는 경우 수정
docker push /myhttpd:lts svng/mycopyhttpd
업로드 실습
- docker hub 에서 repository 생성
- 이미지를 도커 허브에 업로드
- docker login 명령으로 로그인 여부를 확인
- docker hub 사이트에서 레포지토리 주소를 확인 : itbam
- 업로드할 이미지를 생성하는데 태그가 itbam/앱이름:버전 으로 만들어져야 함
- 생성된 이미지가 없어, 이미지를 다운로드 받아 이름을 변경
- docker pull httpd:latest
- docker tag httpd:latest itbam/svng:latest
- 업로드 : docker push 태그
- docker push itbam/svng:latest
- 도커 허브 사이트에서 확인
- docker pull itbam/svng:latest
- 다운로드 되는지 확인 :
- 기존 로컬에 있는 이미지를 삭제
- 여러 개발자와 동일한 환경에서 개발을 수행하고자 하는 경우 이런 형태로 이미지를 만들어서 도커 허브에 업로드하고 다운로드 받아서 컨테이너를 생성하여 수행하는 것이 가능
5.6) 도커 이미지를 파일로 관리
- 원본 이미지 전체를 복사해서 tar 확장자를 가진 Image로 저장
- 생성한 이미지를 Docker Hub를 통해서 배포할 수 없는 경우 주로 이용
- 명령어
- 저장 : docker image save [옵션] 이미지이름 > 파일경로
- 로드 : docker image load < 파일경로
실습
이미지 다운로드 : docker pull mysql:5.7
확인 : docker images
이미지를 파일로 저장 : docker image save mysql:5.7 > test-mysql57.tar
기존 이미지 삭제 : docker image rm mysql:5.7
이미지를 파일로부터 로드 : docker image load < test-mysql57.tar
이미지 확인 : docker images
이름을 변경해서 읽어오기(windows에서는 불가, linux에서 가능) : cat test-mysql57.tar | docker import - mysql57:1.0
5.7) 이미지 삭제
- 명령어 : docker image rm [옵션] [이미지 이름[:태그} | Image ID]
- 태그는 latest 가 아니면 반드시 작성
- 관련된 이미지를 모두 삭제할 때 -f 옵션을 사용
- mysql:5.7 이미지 삭제 : docker image rm mysql 은 에러가 발생(latest 버전이 아니라서 에러)
- docker image rm mysql:5.7
- 리눅스나 Mac 에서는 셸 스크립트를 사용하는 것이 가능
- docker rmi $(docker images | grep debian) -> debian 이 포함된 이미지만 삭제
- UNIX 유닛 단위로 실행하는데 하나의 출력을 다른 하나의 입력으로 받고자 하는 경우 |(파이프)를 이용 합니다.
- docker images | grep debian 을 입력하면 docker images 명령을 수행하고 그 결과를 grep debian 명령에 전달하는데 grep는 문자열이 포함된 것만 추출하는 명령이므로 debian 이라는 문자열을 포함하는 모든 이미지가 되고 그 이미지들을 rmi 명령으로 제거
- docker rmi $(docker images | grep -v debian) -> debian 이 포함된 이미지를 제외하고 삭제
- 사용중이 아닌 이미지 제거
- 사용 중이 아닌 모든 이미지 제거(컨테이너로 만들어지지 않은 이미지 제거): docker image prune -e
- 사용 중이 아닌 48 시간 이전의 모든 이미지 제거 : docker image prune -a -f --filter "until=48h"
- 이미지가 삭제되지 않는 경우 : 컨테이너가 사용 중인 이미지는 삭제가 안됨
- 이 경우 컨테이너를 제거하고 삭제해야 합니다.
- docker image pull gihyodocker/echo:latest
- docker run -t -p 9000:8080 gihyodocker/echo:latest
- docker image rm (삭제가 안됨)
6. Container
6.1) 개요
- Image는 읽기 전용의 불변의 값
- Container는 Image에 읽고 쓰기가 가능한 레이어를 추가해서 만든 일종의 프로세스
- 컨테이너 명령은 대부분 서비스 실행과 운영에 관련된 명령어
6.2) 이미지 다운로드 및 컨테이너 실행
- docker image pull gihyodocker/echo:latest -> image를 다운로드 받는 명령어
- # 이 명령은 수행하고 나면 도커가 사용할 수 있는 gihyodocker/echo:latest라는 이미지가 도커 안에 저장
- docker container run -t -p 9000:8080 gihyodocker/echo:latest
- # 이 명령은 gihyodocker/echo:latest 이미지를 가지고 격리된 프로세스를 만들어서 실행하고 내부의 8080 port를 외부에서는 9000으로 접속할 수 있게 해주는 것
- # 브라우저에 localhost:9000으로 접속시 Hello Docker 라는 텍스트를 가진 페이지가 출력됩니다
6.3) 컨테이너 실행 과정
- docker run 명령을 사용하면 도커 이미지 존재 여부를 확인하고 이미지가 존재하지 않으면 다운로드 받고 이미지를 기반으로 스냅샷(Snap Shot)을 생성하고 그 위에 읽고쓰기가 가능한 레이어를 추가하고 docker start 명령을 수행해서 컨테이너를 시작
- docker start 명령을 수행해서 컨테이너를 시작
- 실행 중인 컨테이너 확인 docker ps
- 모든 컨테이너 확인 : docker ps -a
6.4) 리눅스 이미지를 다운로드 받고 컨테이너를 생성한 후 셸에 접속
- 우분투 이미지 다운로드
- docker pull ubuntu:20.04
- 컨테이너를 생성
- docker create -it --name container-test1 ubuntu:20.04
- 컨테이너 확인
- docker ps -a
- 컨테이너 실행
- docker start container-test1
- 컨테이너에 접속
- docker attach container-test1 -> 우분투 bash shell 에 접속하는 코드(단, sudo는 불가 상태)
- 나갈땐 exit
- 컨테이너 삭제
- docker container rm container-test1
- 이미지 다운로드 및 컨테이너 생성과 실행을 한꺼번에 수행
- docker run -it --name container-test1 ubuntu:20.04 bash
6.5) 컨테이너의 수명 주기
- 실행 상태
- run 이나 start 명령어로 컨테이너를 실행할 수 있는데 작업이 끝나거나 사용자가 중지를 하지 않으면 계속 유지
- 정지 상태
- stop 명령어나 작업이 끝난 경우 이전 상태를 보존하고 있기 때문에 이어서 작업이 가능한 상태
- 파기
- rm 명령으로 삭제한 경우로, 모든 내용이 소멸됩니다.
6.6) docker run
- docker image pull, docker container create, docker container start 명령을 합친 것과 같은 명령
- 기본 형식
- docker run [옵션] 이미지 [인자]
- 인자는 이미지에 따라 달라집니다.
- 옵션
- --name : 컨테이너의 이름을 설정하는 옵션으로 생략하면 이름은 임의로 지정
- -p, --publish [Host Port]:[Container Port]: 외부에서 컨테이너에 접속할 수 있도록 하고자 하는 경우 사용하는 포트포워딩 설정
- -p, --publish-all = true : 컨테이너 내부의 모든 포트를 임의로 포트로 포워딩
- -v, --volume=호스트경로:컨테이너경로: 볼륨 마운트
- --net : 네트워크 연결 (컨테이너가 간의 네트워크 연결)
- -i, --interface : 대화식 모드 연결
- -t : 단말 디바이스 할당
- -d, --detach : 백그라운드에서 실행
- 데몬 형태로 동작시켜야 할 때 -dti 로 설정
- -e : 환경 변수 설정
- 이미지마다 변수가 다름
- --rm : 컨테이너 종료 시 자동으로 컨테이너 파기
- -h : 컨테이너의 호스트 이름을 지정하는 옵션/ default : 컨테이너 ID가 설정
- -d는 컨테이너를 백그라운드로 실행하는 옵션이고 -i 와 -t 는 컨테이너 내부의 터미널로 접속하기 위해 사용하는 옵션입니다.
Tomcat : 8080번 포트를 사용
-p 8080:8080 여기서 밑줄 친 번호가 외부 접속시 포트 번호 이므로, 컨테이너 마다 해당 위치 번호는 달라야 함
0~1023 port 는 known port 라고 불림
22 : telnet
80 : http
443 : https (웹 서비스 중 필수)
1521 : Oracle
3306 : MySQL
27017 : Mongo DB
포트 충돌시 서비스가 안되는 경우가 생기므로 꼭 확인합시다!
###
unix의 uni 는 unit 의 약자입니다
즉 unix 는 다중 작업이 불가하고 단일 작업만 가능하므로, 여러 작업이 필요한 경우, 한 작업씩 떼어서 연결해야 합니다.
-> 파이프 작업
grep, find 등을 활용
6.7) docker ps
- 컨테이너 목록을 출력하는 명령
- -a 옵션을 사용하면 모든 컨테이너 목록을 출력하고 사용하지 않으면 실행 중인 컨테이너 목록을 출력
6.8) 중지 및 삭제
- 중지는 docker stop
- 삭제는 docker rm
6.9) 실습
- httpd(웹 서버) 이미지를 컨테이너로 생성해서 실행하고 중지한 후 삭제
- 웹서버나 서버 애플리케이션 그리고 데이터베이스는 데몬으로 실행해야 합니다. (-d 옵션)
- docker container run --name 이름 -d httpd
- docker container stop 이름
- docker container rm 이름
- 외부에서 컨테이너에 접근 : 포트 포워딩을 하지 않으면 외부에서는 내부의 컨테이너에 접속할 수가 없습니다.
- httpd 서비스는 웹 서버 역할을 수행합니다.
- 80번 포트에 접속을 하게되면 index.html 을 index.html 이 없으면 자신의 기본 화면을 출력합니다.
- docker container run --name ex1 -d httpd
- docker ps
- docker container run --name ex3 -p 8000:80 -d httpd
- 브라우저에서 localhost:8000 을 하게되면 It Works! 화면이 출력됨
6.10) 다양한 이미지
- 운영체제
- ubuntu
- centos
- debian
- fedora
- busybox
- alpine : 경량화 한 버전
- 웹 서버 : 포트 포워딩을 수행해야 외부에서 웹 사이트에 접근
- httpd
- apache2
- nginx
- DB Server
- mysql
- mariadb
- postgres
- (3가지 데이터베이스는 실행 할 때 ROOT_PASSWORD를 설정해야 함)
- oracle
- mongodb
- redis
- 데이터베이스도 포트포워딩을 수행해야 외부에서 접근이 가능합니다.
- 프로그래밍 언어
- openjdk
- python
- php
- ruby
- gcc
- node
- golang
- framework
- wordpress
- redmine
- 이 2개의 프레임워크는 MySQL 이나 PostgreSQL 과 같이 설정되어야 합니다.
- nginx(웹 서버) 컨테이너 실행
- nginx 는 80번 포트를 이용해서 외부 접근을 받아들입니다.
- 웹 서버 이므로 데몬으로 실행(-d) 해야 하고 외부 접근을 받아들이기 위해 포트 포워딩(-p) 을 해주어야 합니다.
- 컨테이너를 만들 때 이름을 설정하지 않으면 이름이 임의로 생성 되므로 다른 곳에서 사용 시 불편할 수 있음.
docker container run --name test1 -p 8000:80 -d nginx
- 오라클을 설치해서 외부에서 접속
- 이미지 이름은 jaspeen/oracle-xe-11g
- 포트는 8080과 1521 번을 사용
- 설치가 되면 sid는 xe, 관리자 계정은 system 비밀번호는 oracle로 설정됨
- docker run --name=oracle11g -d -p 1521:1521 -p 8080:8080 jaspeen/oracle-xe-11g
- 데이터 베이스 접속 도구에서 sid 는 xe, 관리자 계정은 system 비밀번호는 oracle로 설정하여 접속해 성공시키면 됩니다.
7. 호스트와 컨테이너 사이의 파일 복사
7.1) 이유
- 컨테이너에 필요한 파일을 컨테이너 안에서 작성하는 것이 불편하기 때문
- 컨테이너는 삭제가 되면 모든 내용이 사라지는데 컨테이너를 삭제해도 데이터를 사라지지 않도록 하려면 볼륨을 이용하여 호스트 컴퓨터에 저장하면 됩니다.
7.2) 파일 복사
- docker cp source destination
- 컨테이너 경로를 적을 때는 이름:경로 의 형태로 적어야 합니다.
- apache web server(httpd)는 80번 포트를 이용해서 외부 접근을 허용하고 /usr/local/apache2/htdocs/ 디렉토리에 있는 index.html 파일을 welcome 파일로 사용
실습
- httpd 컨테이너를 생성(웹 서버 이므로 -d , 포트 포워딩을 수행)
- docker run --name apacheweb -d -p 9000:80 httpd
- docker ps 로 실행중인지 확인
- 브라우저에서 localhost:9000 으로 접속 -> It Works! 가 출력
- 도커 컨테이너 안에 있는 파일을 현재 디렉토리로 가져오기
- docker cp apacheweb:/usr/local/apache2/htdocs/index.html index.html
- 현재 디렉토리에 index.html 파일이 복사되었는지 확인
- 메인화면 수정을 위해서 복사된 index.html 파일을 수정
- 호스트 컴퓨터의 파일을 도커 컨테이너로 복사
- docker cp index.html apacheweb:/usr/local/apache2/htdocs/index.html
- nginx 는 /usr/share/nginx/html/index.html 이 welcome 파일 입니다용
- 웹 서버 접근 로깅을 하고자 하는 경우
- docker logs -f ngin
- 중지와 재실행
- 중지 : docker pause 컨테이너이름
- 재실행 : docker unpause 컨테이너이름
- 재시작 : docker restart 컨테이너이름
'Docker' 카테고리의 다른 글
Kubenetes (1) | 2023.10.19 |
---|---|
Kubenetes(2) (0) | 2023.10.13 |
Docker(3) (2) | 2023.10.10 |