** Docker
***1.컨테이너 와 가상화
1)전가상화
=>Virtual Machine 이라고 부르는 하드웨어 가상화를 이용해서 프로세스를 격리
=>VirtualBox 나 VMWare 같은 가상화 기술은 가상의 물리 서버를 만드는 것으로 애플리케이션을 독립된 가상머신 이미지에 배치함으로써 완벽하게 격리된 환경에서 실행
=>물리적인 대상을 소프트웨어로 대체한 개념으로 운영체제도 아무것이나 설치할 수 있고 그 위에 어떤 소프트웨어를 설치해도 상관없음
물리적인 컴퓨터(서버) > HOST OS > Hypervisor > GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
각 앱은 분리된 GuestOS 이미지에서 실행
이미지 실행은 Hypervisor 가 수행
Vagrant 가 대표적인 도구로 개발 및 테스트 환경에 적합
=>단점
낮은 성능
높은 자원 소비
파일 크기가 큼
=>전 가상화라고 부르던 방식
2)반 가상화
=>하드웨어를 완전히 가상화하지 않는 방식
=>하드웨어가 하이퍼바이저에게 직접 명령을 전달하는 방식
물리적인 컴퓨터(서버) > Hypervisor > GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
GuestOS > 바이너리/라이브러리 > 앱
=>Guest OS의 커널을 수정해야하기 때문에 Open Source OS 가 아니면 사용하기 어려움
=>Xen 이 대표적인 방식
3)컨테이너 가상화
=>Host OS 위에 컨테이너 관리 소프트웨어를 설치해서 논리적으로 컨테이너를 나누어 사용하는 방식
물리적인 컴퓨터(서버) > Host OS > 컨테이너 관리 소프트웨어 > 미들웨어 > 애플리케이션
미들웨어 > 애플리케이션
=>장점: 오버헤드가 적어서 가볍고 속도가 빠름
=>단점: 다양한 OS를 사용할 수 없고 보안적으로는 완전한 격리가 아님
운영체제 자체를 공부하고자 할 때는 아직도 전 가상화를 이용
=>이러한 컨테이너 관리 소프트웨어로 가장 많이 사용되던 것이 Docker
=>Host OS의 프로세스 수준에서 격리
=>각 컨테이너는 별도의 라이브러리를 가지기 때문에 다른 컨테이너의 업데이트가 영향을 미치지 않음
2.Docker
1)개요
=>Container 형 가상화 기술을 구현하기 위한 상주 애플리케이션 과 이 애플리케이션을 조작하기 위한 명령행 도구고 구성되는 애플리케이션
=>프로그램 과 데이터를 다른 프로그램 과 데이터와 격리시키는 기능을 제공하는 애플리케이션 - 컨테이너 가상화
=>이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 Docker
2)특징
=>Microservice 전환 및 DevOps, Testing 등 다양한 분야에서 활용
=>리눅스 컨테이너 구현체의 사실 상의 표준(de-facto)
3)Docker는 리눅스를 사용
=>Docker는 리눅스 기반에서만 사용 가능
=>Windows 나 Mac OS에서도 Docker를 구동 시킬 수 있지만 이 경우 내부적으로 리눅스가 사용되며 컨테이너에서 동작시킬 프로그램도 리눅스 용 프로그램
=>Windows 에서 사용할 때는 리눅스 커널을 설치해야 합니다.
=>사용하는 리눅스의 기술
chroot: 특정 디렉토리를 최상위 디렉토리 root로 인식하게끔 설정하는 리눅스 명령
namespace: 프로세스 자원을 관리하는 기능
cgroup: 자원의 사용량 제어
4)Docker Hub, Image, Container
=>Image
Docker에서 사용하는 애플리케이션의 개념
컨테이너를 만들어내는 설계도 역할을 수행
하나만 있으면 여러 개의 컨테이너를 생성할 수 있음
컨테이너로부터 이미지를 생성하는 것도 가능
종류
운영체제 와 유사한 형태: 실제 운영체제를 학습하는 용도로는 사용하기가 어려움
하나의 소프트웨어를 포함한 이미지: 파이썬, 고, C, Java 등을 포함한 이미지
소프트웨어 여러 개를 포함한 이미지: 운영체제, 프로그래밍 언어, 데이터베이스 등을 복합적으로 하나로 묶어서 사용하는 경우 - 개발 환경을 설정하거나 애플리케이션을 배포할 때 사용
=>Docker Hub
이미지 들을 배포하고 자유롭게 다운로드 할 수 있는 웹 저장소
=>Container
이미지를 이용해서 실행되는 프로세스의 개념
일반적으로는 하나의 컨테이너에 하나의 프로그램만 사용하는 것을 권장하지만 애플리케이션을 배포할 때는 이 원칙을 지키지 않는 경우도 있습니다.
Docker 컨테이너는 쓰고 버리는 일회용품
컨테이너에 저장한 데이터는 원칙적으로 컨테이너가 폐기되면 소멸됨
컨테이너에 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능
5)성질
=>환경을 격리
독립된 환경
여러 개의 애플리케이션을 실행할 수 있음
동일한 애플리케이션을 여러 개 실행할 수 있음
이미지를 만들 수 있음
이동이 편리
동일한 컨테이너를 쉽게 만들 수 있음
환경 이동이 쉬움
개발 환경을 배포하기가 쉬움
도커 레지스트리
이미지를 내려받는게 수월 - 이미지를 직접 만들지 않아도 됨
교체하기 수월 - 업데이트가 쉽고 소프트웨어 교체가 수월
커널이 없음: 운영체제를 직접 설치하지 않음
가벼움
배포판을 바꾸는게 수월
운영체제의 동작을 완전히 재현하지는 못하기 때문에 운영체제를 세밀하게 조작하는 작업에는 맞지 않고 리눅스 환경에서만 사용이 가능
6)주 용도
=>PaaS 서비스를 가능하게 하는 소프트웨어 개발 환경을 제공
IaaS(AWS, GCE, Azure, OCI, NHN, Open Stack 등): 오케스트레이션 도구(Kubenetes, 도커 스웜 등) - LXC/Docker 기술 - 컨테이너로 구동되는 애플리케이션
7)구성 요소
=>Docker Engine: Docker를 이용한 애플리케이션 실행 환경 제공을 위한 핵심 요소
=>Docker Hub: 컨테이너 이미지를 공유한느 클라우드 서비스
=>Docker-Compose: 의존성있는 독립된 컨테이너에 대한 구성 정보를 yaml 코드로 작성하여 일원화된 애플리케이션 관리를 가능하게 도구로 Dockerfile 도 있음
=>Docker Registry: Docker 컨테이너 이미지를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구
=>Docker Machine: Docker 실행 환경을 생성하기 위한 도구
=>Docker Swarm: 여러 Docker 호스트를 클러스터로 구축하여 관리할 수 있는 도커 오케스트레이션 도구로 쿠버네티스도 있음
8)Docker Engine 설치
=>Docker Hub 사이트에서 회원 가입
=>Windows
리눅스 커널을 다운로드 받아서 설치한 후 수행
wsl --install
wsl --set-default-version 2
Docker Desktop을 다운로드 받아서 설치
=>Mac
Docker Desktop을 다운로드 받아서 설치
=>Linux 는 설치 과정이 조금 복잡
3.기본명령어
1)이미지 다운로드
=>docker pull hello-world
이미지 이름이 틀리지 않아서 다른 운영체제에서는 다운로드가 되는데 Mac M1 이상의 프로세서에서 안되는 경우는 --platform linux/amd64 를 추가해주면 됩니다.
다운로드 받지 못하는 경우 저 메시지가 출력됩니다.
2)이미지 확인
=>docker images
=>docker desktop을 설치한 경우는 images 탭에서 확인이 가능
3)컨테이너 생성
=>docker run hello-world
4)컨테이너 확인
=>docker ps -a
=>docker desktop을 설치한 경우는 containers 탭에서 확인이 가능
5)도커 버전 확인
=>docker version
=>docker는 client 와 server로 구성
=>client는 사용자로부터 도커 명령을 받고 결과를 출력하는 역할을 수행
도커 명령을 수행하는 명령줄(Command Line)을 제공
명령을 도커 데몬에게 전달하고 도커 데몬이 수행한 결과를 출력
=>server는 도커 엔진(도커 데몬)을 이용해서 컨테이너를 시작하고 운영하고 정지 등을 수행
6)도커 구성 정보 확인
=>docker info
=>커널 정보, 현재 컨테이너 수 등의 정보가 출력
7)디스크 사용량 확인
=>docker system df
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=webapp' : webapp 이라는 컨테이너의 이벤트 로그만 출력됨
=>시간 설정 가능
docker system events --since 12h: 12시간 전 부터의 로그
=>로그를 JSON 형식으로 출력
docker system events --format '{{json .}}'
windows 에서 수행하는 경우는 power shell 에서는 명령어가 동일한 cmd 창에서는
docker system events --format "{{json .}}"
=>로그를 출력하는 경우는 모니터링을 위해서인데 일반적으로 PaaS 서비스에서 도커를 제공하는 경우 어떤 명령들을 수행했는지 확인하기 위한 용도로 사용
4.Docker Registry
=>Image를 배포하는 장소를 Docker Registry 라고 합니다.
=>Docker Hub는 도커 제작사의 공식 도커 레지스트리
5.Image 관련 명령
1)도커 컨테이너를 이용하는 애플리케이션 서비스 개발 과정
애플리케이션 코드 개발 -> 기본 이미지를 이용한 Dockerfile 작성 -> Dockerfile 빌드를 통한 새로운 이미지를 생성 -> 생성된 이미지를 이용해서 컨테이너 실행(도커 컴포즈를 이용한 다중 컨테이너 실행 -> Micro Service 테스트) -> 컨테이너 애플리케이션 서비스 테스트 -> 로컬 및 원격 저장소에 이미지를 저장 -> Git Hub 등을 활용한 Docker file 관리 -> 동일 환경에서의 지속적 애플리케이션 개발 수행
2)IaC(Infrastructure as Code)
=>컨테이너 동작에 필요한 모든 내용을 사전에 코드로 작성해서 Ansible, Vagrant 와 같은 Infra Provisioning 도구로 자동화하게 되면 필요할 때 마다 애플리케이션 및 서버 환경을 적은 비용으로 빠르게 개발하고 배포하고 확장할 수 있는데 이것을 IaC 라고 합니다.
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
=>상위 커맨드 없이 사용하는 커맨드
checkpoint: 현재 상태를 일시적으로 저장하는 기능
node: 도커 스웜의 노드를 관리하는 기능
plugin: 플러그인 관리하는 기능
secret: 비밀값 정보를 관리
service: 도커 스웜의 서비스를 관리하는 기능
stack: 여러 개의 도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리
swarm: 도커 스웜 관리
system: 도커 엔진의 정보를 확인
login
logout
search: 도커 레지스트리 검색
version
=>프로그램 실행 도중에는 변경되지 않지만 환경이 변경되는 경우 수정해야 하는 문자열이나 숫자가 있으면 이런 코드는 하드 코딩하지말고 별도의 설정 파일을 만들어서 설정 파일에서 읽어오는 방식을 취하는 것이 좋습니다.
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는 -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 history 이미지이름
하나의 명령어가 아니고 여러 개의 명령어로 구성된 경우가 많은데 하나의 명령어를 레이어라고 합니다.
docker pull httpd
docker image history httpd
나오는 정보 중에서 사이즈를 가진 것만 레이어라고 하기도 합니다.
이러한 레이어 와 CMD, EXPOSE, ENV, WORKDIR 등의 명령어가 조합이 되서 하나의 이미지를 생성
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
=>이미지를 도커 허브에 업로드
docker login 명령으로 로그인 여부를 확인
docker hub 사이트에서 레포지토리 주소를 확인: ggangpae1
업로드할 이미지를 생성하는데 태그가 ggangpae1/앱이름:버전 으로 만들어져야 합니다.
생성된 이미지가 없어서 이미지를 다운로드 받아서 이름을 변경
docker pull httpd:latest
docker tag httpd:latest ggangpae1/adam:latest
업로드: docker push 태그
docker push ggangpae1/adam:latest도커 허브 사이트에서 확인
다운로드가 되는지 확인
기존 로컬에 있는 이미지를 삭제
docker pull ggangpae1/adam:latest여러 개발자 와 동일한 환경에서 개발을 수행하고자 하는 경우 이런 형태로 이미지를 만들어서 도커 허브에 업로드하고 다운로드 받아서 컨테이너를 생성해서 수행하는 것이 가능
6)도커 이미지를 파일로 관리
=>원본 이미지 전체를 복사해서 tar 확장자를 가진 Image로 저장
=>생성한 이미지를 Docker Hub를 통해서 배포할 수 없는 경우 주로 이용
=>명령어
저장: docker image save [옵션] 이미지이름 > 파일경로
로드: docker image load < 파일경로
=>실습
이미지 다운로드: docker pull mysql:5.7
M1 프로세서에서 다운로드가 안되는 경우에는 docker pull --platform=linux/amd64 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에서 가능 - windows에서는 cat 명령을 이용해서 tar 파일을 출력할 수 가 없음): cat test-mysql57.tar | docker import - mysql57:1.0
7)이미지 삭제
=>명령어: docker image rm [옵션] [이미지 이름[:태그] | ImageID]
태그는 latest 가 아니면 반드시 작성
관련된 이미지를 모두 삭제할 때 -f 옵션을 사용
ggangpae1/adam:latest 이미지 삭제: docker image rm ggangpae1/adam
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 gihyodocker/echo:latest
6.Container
1)개요
=>Image는 읽기 전용의 불변의 값
=>Container는 Image 에 읽고 쓰기가 가능한 레이어를 추가해서 만든 일종의 프로세스
=>컨테이너 명령은 대부분 서비스 실행 과 운영에 관련된 명령어
2)이미지 다운로드 및 컨테이너 실행
docker image pull gihyodocker/echo:latest
#이 명령은 수행하고 나면 도커가 사용할 수 있는 gihyodocker/echo:latest 이미지가 도커 안에 저장
docker container run -t -p 9000:8080 gihyodocker/echo:latest
#이 명령은 gihyodocker/echo:latest 이미지를 가지고 격리된 프로세스를 만들어서 실행하고 내부의 808 0 포트를 외부에서는 9000 으로 접속할 수 있도록 해주는 것입니다.
#현재IP:9000 으로 접속하면 웹 페이지를 출력해주는 컨테이너입니다.
#브라우저에 localhost:9000 으로 접속하면 Hello Docker라는 텍스트를 가진 페이지가 출력됩니다.
#리눅스나 Mac에서는 wget http://localhost:9000 이나 curl http://localhost:9000 을 사용해도 됩니다.
3)컨테이너 실행 과정
=>docker run 명령을 사용하면 도커 이미지 존재 여부를 확인하고 이미지가 존재하지 않으면 다운로드 받고 이미지를 기반으로 스냅샷(Snap Shop)을 생성하고 그 위에 읽고 쓰기가 가능한 레이어를 추가하고 docker start 명령을 수행해서 컨테이너를 시작
=>실행 중인 컨테이너 확인: docker ps
=>모든 컨테이너 확인: docker ps -a
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
#apt-get update
#exit
=>컨테이너 삭제
docker container rm container-test1
=>이미지 다운로드 및 컨테이너 생성 과 실행을 한꺼번에 수행
docker run -it --name container-test1 ubuntu:20.04 bash
5)컨테이너의 수명 주기
=>실행 상태
run 이나 start 명령어로 컨테이너를 실행할 수 있는데 작업이 끝나거나 사용자가 중지를 하지 않으면 계속 유지
=>정지 상태
stop 명령어나 작업이 끝난 경우로 이전 상태를 보존하고 있기 때문에 이어서 작업이 가능한 상태
=>파기
rm 명령으로 삭제한 경우로 모든 내용이 소멸됩니다.
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: 컨테이너의 호스트 이름을 지정하는 옵션으로 지정하지 않으면 컨테이너 ID가 설정됨
=>-d는 컨테이너를 백그라운드로 실행하는 옵션이고 -i 와 -t 는 컨테이너 내부의 터미널로 접속하기 위해 사용하는 옵션입니다.
7)docker ps
=>컨테이너 목록을 출력하는 명령
=>-a 옵션을 사용하면 모든 컨테이너 목록을 출력하고 사용하지 않으면 실행 중인 컨테이너 목록을 출력
8)중지 및 삭제
=>중지는 docker stop
=>삭제는 docker rm
9)실습
=>httpd(웹 서버) 이미지를 컨테이너로 생성해서 실행하고 중지한 후 삭제
웹서버 나 서버 애플리케이션 그리고 데이터베이스는 데몬으로 실행해야 합니다.
docker container run --name 이름 -d httpd
docker container stop 이름
docker container rm 이름
=>외부에서 컨테이너에 접근: 포트 포워딩을 하지 않으면 외부에서는 내부의 컨테이너의 컨텐츠를 사용할 수 없습니다.
httpd 서비스는 웹 서버 역할을 수행합니다.
80번 포트에 접속을 하게되면 index.html 을 index.html 이 없으면 자신의 기본 화면을 출력합니다.
docker container run --name ex02 -d httpd
docker ps
docker container run --name ex03 -p 외부에서사용할포트번호:내부포트번호 -d httpd
docker container run --name ex03 -p 8000:80 -d httpd
브라우저에서 localhost:8000 을 하게되면 It Works! 화면이 출력 됩니다.
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번 포트를 이용해서 외부 접근을 받아들입니다.
웹 서버이므로 데몬으로 실행해야 하고 외부 접근을 받아들이기 위해서 포트 포워딩을 해주어야 합니다.
컨테이너를 만들 때 이름을 설정하지 않으면 이름이 임의로 만들어지기 때문에 다른 곳에서 사용할 때 불편합니다.
docker run --name nginx_ex -d -p 8001:80 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.호스트 와 컨테이너 사이의 파일 복사
1)이유
=>컨테이너에 필요한 파일을 컨테이너 안에서 작성하는 것이 불편하기 때문에
=>컨테이너는 삭제가 되면 모든 내용이 사라지는데 컨테이너를 삭제해도 데이터를 사라지지 않도록 할려면 볼륨을 이용해서 호스트 컴퓨터에 저장하면 됩니다.
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브라우저에서 localhost:9000 으로 접속
It Works 라는 내용이 나옴도커 컨테이너 안에 있는 파일을 현재 디렉토리로 가져오기
docker cp apacheweb:/usr/local/apache2/htdocs/index.html index.html현재 디렉토리에 index.html 파일이 복사되었는지 확인
메인화면 수정을 위해서 복사된 index.html 파일을 수정
Hello Adam Docker File Copy
호스트 컴퓨터의 파일을 도커 컨테이너로 복사
docker cp index.html apacheweb:/usr/local/apache2/htdocs/index.html
=>nginx 는 /usr/share/nginx/html/index.html 이 welcome file 입니다.
docker cp index.html nginx_ex:/usr/share/nginx/html/index.html
=>웹 서버 접근 로깅을 하고자 하는 경우
docker logs -f nginx_ex
=>중지 와 재실행
중지: docker pause 컨테이너이름
재실행: docker unpause 컨테이너이름
재시작: docker restart 컨테이너이름