- 기존 IaaS(AWS, GCE, Azure, NHN, OCI, Open Stack 등)
LXC/Docker 기술
컨테이너로 구동되는 애플리케이션
wsl --install
wsl --set-default-version 2
docker pull hello-world
--platform linux/amd64
추가하기docker images
docker run hello-world
, run 이미지 이름docker ps -a
docker version
docker info
docker system df
docker system events
docker system events
명령을 수행docker run -dit -p 80:80 --name=webapp nginx
명령을 수행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시간 전 부터의 로그docker system events --format='{{json .}'
"{{json .}"
으로 해야함애플리케이션 코드 개발
기본 이미지를 이용한 Dockerfile 작성
Dockerfile 빌드를 통한 새로운 이미지 생성
생성된 이미지를 이용해서 컨테이너 실행(도커 컴포즈를 이용한 다중 컨테이너 실행 Micro Service 테스트)
컨테이너 애플리케이션 서비스 테스트
로컬 및 원격 저장소에 이미지를 저장
Git Hub 등을 활용한 Dockerfile 관리
동일한 환경에서의 지속적 애플리케이션 개발 수행
docker search [--limit 개수] 이미지이름
docker image pull [옵션] 이미지이름[:TAG|@IMAGE_DIGEST]
latest
태그가 자동 부여=
을 이용-a, --all-tags
이 두 태그는 같은 의미--platform=linux/amd64
이렇게 옵션에 파라미터 대입 가능-dpi
이렇게 쓸 수 있음-a, -all-tags
: 저장소에 태그로 지정된 여러 image를 한번에 다운로드--disable-content-trust
: 이미지 검증 작업을 수행하지 않습니다.--platform=플랫폼
: 플랫폼에 해당하는 이미지를 가져옵니다.-q, --quiet
: 이미지 다운로드 과정에서 나타나는 상세 출력을 숨김
- 별도의 옵션 없이 jenkins/jenkins:lts 다운로드 해보기
- 별도의 옵션 없이 debian 다운로드 해보기
- 확인은 docker desktop에서 images 탭이나 cmd
docker images
- 도커 이미지 확인 :
docker images(docker image ls)
- 이미지 세부 정보 확인
-docker image inspect 이미지이름
- 이미지의 레이어 정보 확인
-docker image history 이미지이름
- 하나의 명령어가 아니고, 여러 개의 명령어로 구성된 경우가 많은데, 하나의 명령어를 레이어 라고 합니다.
- 여기서 보면, pull 이 한 번만 있는게 아닌 것을 알 수 있다.
- 이 명령어 하나하나를 레이어라고 한다.
- 나오는 정보 중에서 사이즈를 가진 것만 레이어 라고 하기도 합니다.
- 이러한 레이어와 CMD, EXPOSE, ENV, WORKDIR 등의 명령어가 조합이 되어서 하나의 이미지를 생성합니다.
docker login
, docker logout
sonicdata.com/sonic:20
의 형태를 권장docker tag 태그
docker push 태그
httpd 이미지로 해보자.
docker image tag httpd:latest myhttpd:lts
- httpd:latest에 이미지를 myttpd:lts라는 이름을 부여함
- 이름 변경docker tag myhttpd:lst mycopyhttpd
docker push 계정명/myhttpd:lts
- 도커 허브에 업로드를 해볼까?
- 도커 허브에 repository 확인- 업로드 이미지 확인
- 태그는namespace/appname:version
으로 해야한다.
- 생성된 이미지 없어서 이미지 다운받아 이름 변경을 하자
-docker pull httpd
로 이미지 다운완료
-docker tag httpd:latest namespace/appname:latest
이름변경- 업로드
-docker push namespace/appname:latest
해주기- hub에 있는 이미지 다운로드가 되는지 확인
- 기존 로컬 이미지 삭제
-docker pull namespace/appname:latest
해보자- 여러 개발자와 동일한 환경에서 개발을 수행하고자 하는 경우, 이런 형태로 이미지를 만들어서 도커 허브에 업로드하고 다운롣 받아서 컨테이너를 생성해서 수행하는 것이 가능하다.
docker image save [옵션] 이미지이름 > 파일경로
docker image load < 파일경로
실습
- 이미지 다운로드
-docker pull mysql:5.7
- 확인
-docker images
- 이미지를 파일로 저장
-docker image save mysql:5.7 > test-mysql57.tar
- cmd 현 위치에서 dir 입력
- 목록에 해당 파일이 존재해야함
- 기존 이미지 삭제를 해보자
-docker image rm mysql:5.7
-docker image rm [옵션] [이미지이름[:태그] | imageID]
- tag는 latest가 아니면 무조건 작성(tag 안쓰면 latest로 인식)
- 관련된 이미지를 모두 삭제할 때는 -f 옵션을 이용합니다.- 이미지를 파일로부터 로드
-docker image load < test-mysql57.tar
- 이름을 변경해서 로드할 수 있습니다.(Linux)
-cat test-mysql57.tar | docker import - mysql57:1.0
- windows에서는 cat 명령을 이용해서 tar 파일을 출력할 수 가 없음
docker image prune -e
docker iamge 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/latest
- 이게 안먹힐 것이다.
- 실행 끄고 하면 될 것이다.
정적(Static) | 동적(Dynamic) |
---|---|
Class | Instance |
Schema(Table) | Instance |
Program | Process |
Image | Container |
docker image pull gihyodocker/echo:latest
- 도커가 사용할 수 있는 gihyodocker/echo:latest 이미지가 도커 안에 저장docker container run -t -p 9000:8080 gihyodocker/echo:latest
- 이 명령은 gihyodocker/echo:latest 이미지를 가지고 격리된 프로세스 하나를 만들어서 실행하고, 내부의 8080 포트를 외부에서는 9000으로 접속할 수 있도록 해주는 것
- 현재 IP:9000으로 접속하면 웹페이지 출력해주는 컨테이너임
![]()
docker run
명령을 사용하면, 도커 이미지 존재 여부를 확인하고, 이미지가 존재하지 않으면 다운로드를 받고 이미지를 기반으로 Snap shot을 생성하고 그 위에 읽고 쓰기가 가능한 레이어를 추가하고 docker start
명령을 수행해서 컨테이너를 시작docker ps
docker ps -a
- 우분투 이미지 다운로드
-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
- 계정설정을 안해서 sudo는 못하지만 기본 우분투 작업 가능
![]()
- 컨테이너 삭제
-docker container rm container-test1
- 이미지 다운로드 및 컨테이너 생성과 실행을 한번에 수행해보자
-docker run -it --name container-test1 ubuntu:20.04 bash
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가 설정됨docker stop
docker rm
실습
- httpd 이미지를 컨테이너로 생성해서 실행하고 중지한 뒤, 삭제를 해 보자
- httpd는 웹서버이다
- 웹서버, 서버 애플리케이션 그리고 db는 데몬으로 실행해야 한다.
docker container run --name ex01 -d httpd
- 응답할 수 있나?
docker ps
- 근데 이러면 localhost 뭐 접속하려해도 불가능함
docker container stop ex01
docker container rm ex01
- 외부에서 컨테이너에 접근 : 포트포워딩을 하지 않으면 외부에선 내부 컨텐츠 이용 불가
- httpd 서비스는 웹 서버 역할을 수행합니다.
- 80번 포트에 접속하게 되면,index.html
을, 혹시 없다면 자신의 기본 화면을 출력
- 포트포워딩을 제대로 하자
docker container run --name ex01 -p 외부에서 사용할 포트 번호 : 내부 포트번호 -d httpd
docker container run --name ex01 -p 8001:80 -d httpd
![]()
- 이미지 이름 jaspeen/oracle-xe-11g
- 포트는 8080과 1521번을 사용
- 설치가 된다면 sid는 xe, 관리자 계정은 system, 비밀번호는 oracle로 지정
docker run --name=nginx_ex -d -p 8000:80 nginx
- dbeaver 해보려는데 오라클 커넥션 실패한다.
docker run --name=oracle11g -d -p 1521:1521 -p 8080:8080 jaspeen/oracle-xe-11g
- 8080은 웹포트이다.
![]()
![]()
- 이게 진짜 된다.
- MySQL 로 한다면 -d가 아니라
-dit
를 다 해줘야 한다.
- 설정 파일을 다 건드려야 하는데, mariadb를 그래서 사용하는 경우도 있다.