Docker- 2

박형준·2024년 4월 23일

*도커 설치 [ Rocky 와 Ubuntu는 설치 방법에 차이가 있음 ]

  • Rocky : 필수 프로그램설치 / repository등록/ 도커엔진 설치/ 설치 확인
  • Ubuntu :필수 프로그램설치/ 인증서 저장/ repository등록 / 도커엔진 설치 / 확인

도커란?

  • 컨테이너 기반 가상화 플랫폼으로, 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 플랫폼입니다.

  • 도커를 사용하면 애플리케이션과 그 애플리케이션의 종속성을 격리된 환경으로 패키징하여 이식성이 뛰어난 가상화된 환경에서 실행할 수 있습니다.

  • 도커는 리눅스 컨테이너(Linux Containers) 기술을 기반으로 하며, 애플리케이션을 컨테이너로 패키징하여 호스트 시스템과는 독립된 환경에서 실행할 수 있습니다.

  • 이를 통해 애플리케이션의 이식성, 확장성 및 효율성을 향상시킬 수 있습니다.

이미지를 다운 받는 곳?

  • 도커 이미지를 다운로드하는 곳은 도커 허브(Docker Hub)입니다.

  • 도커 허브는 도커 컨테이너를 빌드, 테스트, 저장 및 배포하기 위한 클라우드 기반의 이미지 레지스트리 서비스입니다.

  • 도커 허브에는 다양한 공식 및 커뮤니티에서 제공하는 도커 이미지가 포함되어 있습니다.

  • 필요한 이미지를 검색하고 다운로드하여 로컬 시스템에서 실행할 수 있습니다.

컨테이너란?

  • 도커에서 컨테이너는 격리된 환경에서 애플리케이션 및 그 애플리케이션의 종속성을 실행하기 위한 실행 가능한 소프트웨어 패키지입니다.

  • 컨테이너는 도커 이미지를 기반으로 만들어지며, 호스트 시스템과는 독립된 파일 시스템, 네트워크 및 프로세스 공간을 제공합니다.

  • 이러한 격리된 환경을 통해 컨테이너는 이식성이 뛰어나며, 다양한 환경에서 일관된 실행을 보장합니다.

  • 또한 컨테이너는 가벼우면서도 빠르게 생성하고 제거할 수 있어서, 애플리케이션을 효율적으로 배포하고 확장하는 데 유용합니다.

볼륨이란?

  • 도커에서 볼륨은 컨테이너가 사용하는 데이터를 호스트 시스템과 공유하기 위한 메커니즘입니다.

  • 볼륨을 사용하면 컨테이너 간에 데이터를 공유하거나, 호스트 시스템과 데이터를 공유할 수 있습니다.

  • 이를 통해 데이터의 영속성을 확보하고, 컨테이너의 생명주기와는 독립적으로 데이터를 관리할 수 있습니다.

  • 도커 볼륨을 사용하면 데이터를 컨테이너에 영구적으로 저장하고, 여러 컨테이너 간에 데이터를 공유하거나 백업할 수 있습니다.

  • 또한 호스트 시스템과의 데이터 공유를 통해 컨테이너가 실행 중에도 데이터를 유지할 수 있습니다.


*명령어로 설치

  • 1.이전 버전 삭제
    • #dnf remove docker
      • docker-client
      • docker-client-latest
      • docker-common
      • docker-latest
      • docker-tatest-logrotate
      • docker-logrotate docker-engine

도커 이전 버전 삭제

  • docker 이전 버전 삭제
  1. 업데이트
  • #dnf check-update
  • #dnf update

docker 업데이트

  • dnf check-update
  • dnf -y update ( dnf 업데이트 )
  1. 저장소(repository) 추가(CentOS/Rocky 전용)

저장소 추가

  • docker 저장소를 시스템에 추가
  1. 도커 패키지 설치(docker-ce)
  • #dnf install docker-ce

docker 설치

  • docker 패키지 설치 (docker-ce)
  • dnf install -y docker-ce
  1. 설치 확인
  • #docker version

설치 확인

  • docker version
  • 시스템 영구 동작

동작 확인

  • Pull: 다운 받아졌다는 것, docker engine test
  • 컨테이너 2개 실행 확인
  • 컨테이너 ID를 통해 삭제 (docker container rm 컨테이너 ID)
  • 컨테이너가 실행중일 때는 삭제 불가능

*웹서버 이미지(nginx) 찾아서 다운/ 동작 시켜보기

  • [root@www ~]# docker search nginx
    [root@www ~]# docker image pull nginx , (:latest 생략하면 최신버전이 다운됨)
    [root@www ~]# docker image rm , (기존에 받은 두개 삭제 ubuntu / hello-world)

웹 서버 만들기 (이미지 다운로드 후 동작, nginx)

  • nginx 이미지 검색 (docker search nginx , stars( 별 표시, 많을수록 안정적 )
  • nginx 이미지 다운로드 (docker image pull nginx)
  • 이미지 다운로드 확인 ( docker image ls )
  • docker 시스템 정보 (docker system info)
  • docker 디스크 용량 확인

docker image 삭제

  • docker image 확인 후 삭제 ( docker image rm 이미지ID )

*다운받은 이미지 동작

  • #docker container run --name webserver -d -p 80:80 nginx
    #docker run --name webserver -d -p 80:80 nginx , (⇒ container 생략해도됨.)

docker webserver 생성 ( 다운로드 받은 이미지 동작 )

  • docker 컨테이너 이름을 webserver로 지정하고 포트 번호와 이미지를 지정 후 동작
  • 생성한 컨테이너 확인 ( docker container ps, 백그라운드로 동작 )
  • 웹 페이지에 접속해서 확인 ( http://localhost:80 )

*웹서버 모니터링

  • [root@www ~]# docker container stats webserver

*중지/동작 시키기

  • [root@www ~]# docker container stop webserver
    • [root@www ~]# docker container ls
  • [root@www ~]# docker container start webserver
    • [root@www ~]# docker container ls

웹서버 모니터링 및 동작과 중지

  • docker container stats webserver , 웹서버 모니터링
  • docker container 리스트 확인 (상태 up , port 번호 바뀌었고 이름 webserver 확인)
  • 다운로드 받은 이미지 확인

*일반사용자도 도커 명령어 사용할 수 있도록 권한 할당.

  • [root@www ~]# usermod -a -G docker rocky9
  • [root@www ~]# ls /var/lib/docker/overlay2

*도커 명령어

-이미지 관리 ( 도커 허브 )

  • docker [ search , pull , ps , inspect(-i):정보확인, tag, rmi , login , push ]
    • #docker search nginx
      #docker search nginx --filter stars=1000
      #docker search --limit 5 mysql –no-trunc
      #docker search quary.io/nginx ⇒ quary.io 저장소에서 nginx 검색

도커 명령어 (이미지 관리)

  • 이미지 관리 ( 도커 허브 )
    docker [ search , image pull , ps , inspect( -i ): 자세한 정보확인, tag, rmi , login , push ]
  • 필터를 이용한 이미지 검색( stars 100개 이상 )
  • 이미지 검색 ( 중요한 이미지 5개만 )

도커 관련 명령어 (이미지 관리)

  • #docker image pull 이미지이름:버전[생략하면 최선 버전으로 다운]
  • docker 이미지 다운로드 (URL에서)

#docker image pull 이미지이름:버전[생략하면 최선 버전으로 다운]

[root@www ~]# docker image list

*태그 생성 ( 저장소에 업로드 할때 많이 사용됨 ) 로컬에선 이름이 많이 사용됨.

  • [root@www ~]# docker image tag nginx test/webser:1.0

도커 관련 명령어 ( 태그 생성 )

  • 태그 생성 ( 업로드 할 때 사용 )
  • docker ps -a ( stop 되어 있는 컨테이너도 보여준다, 삭제 후 이미지 삭제 가능 )

*도커 컨테이너 확인

*도커 이미지 삭제

  • #docker image rm [이미지 이름 또는 ID]
    #docker rmi [이미지 이름 또는 ID]
    • #docker images ( 삭제 확인 )

*도커 허브에 접속 해보기

  • 최초 허브가입시 구글 연동 해서 가입하면 접속시 구글메일 입력하면됨.

    • #docker login
      #docker logout
      ⇒ 한번 로그인을 하면 사용자ID/PW 저장되어 다시 로그인시 정보 입력 안해도됨.
  • 사용자 홈디렉토리에 저장되어짐

docker hub에 로그인

  • docker login 후 logout 하면 아이디와 비밀번호 입력 안해도 접속 가능
  • ./docker/config.json에 아이디와 비밀번호 저장
  • ./docker/config.json 내용 확인

*nginx 이미지 도커 허브에 업로드

  • ⇒ 이미지 없으면 다시 다운로드
    • 태그 설정⇒허브 로그인 ⇒ 이미지 업로드 ⇒ 이미지 업로드 확인⇒로그아웃
    • #docker image tag nginx test/webser:1.0
      #docker image push test/webser:1.0

*업로드 확인은 검색 해보기

  • #docker search test 또는 test/webser:1.0 로 검색

docker hub에 이미지 업로드 ( 허브에 로그인 후 )

  • 다운 받은 nginx를 태그 설정 ( test/webser : 1.0 )
  • docker image push를 이용해서 태그로 만든 이미지 업로드
  • 이미지 업로드 확인
  • docker hub에서 이미지 업로드 확인

-컨테이너 관리

  • 컨테이너 (Container)는 Docker 이미지 인스턴스 실행(실제 응용 프로그램 실행)한 것으로 응용 프로그램과 모든 종속성을 포함한다.
  • 커널을 다른 컨테이너와 공유하고 호스트 os의 사용자 공간에서 격리된 프로세스로 실행한다

*컨테이너 라이프 사이클

  • 생성 ⇒ 구동 ⇒ 시작 ⇒ 종료 ⇒ 삭제
  • docker container [ create ⇒ run ⇒ start ⇒ stop ⇒ rm ]
    • #docker container create --name webserver -p 80:80 nginx
    • #docker run -d --name web -p 8080:80 nginx (8080외부:80내부)
    • #docker stop webserver [web]
    • #docker rm webserver [web]

-한꺼번에 컨테이너 삭제

  • docker container prune ⇒ 모든 컨테이너 한번에 삭제

*쉘 스크립트를 이용해서 컨테이너 생성

  • #vi con.sh
    • ⇒ 10개를 한번에 만들어 보기

-생성된 컨테이너 일괄삭제

  • ⇒ docker container rm -f $(docker container ls -a -q)

쉘 스크립트를 이용해서 컨테이너 생성 ( 이미지 준비 후에 )

  • con.sh 파일에서 컨테이너 생성 코드 입력
  • con.sh 쉘 스크립트 실행 (sh con.sh)
  • 생성된 container 확인
  • 생성된 container ID만 확인
  • 한꺼번에 cintainer 삭제
  • 삭제된 container 확인

*도커 생성시 docker container run / create 차이점

  • create : pull + create
  • run : pull + create + start

*컨테이너 생성 옵션

  • -d: 백그라운드로 동작,
  • -a(add), -i(interactive)
  • -t(SSH)
  • --rm (컨테이너 종료시 삭제)

*컨테이너를 생성 하면서 컨테이너 안으로 진입

  • [root@www ~]# docker container run -it --name myos centos
  • #docker container run -it --name myos centos
  • #docker container run -it --name myos1 centos df -h
  • #docker container run -it --name myos2 centos /bin/bash
  • #docker container run -it --rm --name myos3 centos /bin/bash
    • ⇒ exit 하면 myos3 컨테이너는 삭제됨.
  • #docker container prune ⇒ 모든 컨테이너 삭제

*-it 옵션을 주고 실행하면 아래와 같이 컨테이너 안으로 진입이 됨.

  • [root@73ec3776d6b3 /]#

docker create와 run ( 이미지 삭제 후 )

  • docker container create 명령어로 이름과 포트번호 지정하여 container 생성 ( 이미지 자동으로 생성 )
  • 생성된 container 확인
  • create로 생성된 docker image(nginx) 삭제 후
  • -d 옵션: 백그라운드로 동작,
  • -a 옵션: add(추가),
  • -i 옵션: interactive( 상호작용 모드, 입력 가능 ) ,
  • -t 옵션 : ssh (terminal),
  • --rm 옵션 : 컨테이너 종료시 삭제
  • 8080(외부 포트), 80(내부 포트)
  • docker container run 명령어로 container 생성
  • 생성된 container 확인 ( 활성화된 상태 )
  • 한꺼번에 container 삭제 ( docker container prune )

container 생성하면서 ssh 접속

  • container 로 접속하면서 생성 ( exit로 나오기, ca735abdf355 ( container ID ) )
  • 생성된 container 확인
  • 명령어를 실행시키면서 container 생성
  • container 한꺼번에 삭제 및 확인

-우분투 14.04버전 설치 컨테이너 안으로 진입 하고, 외부에 포트 노출 80:80 이름은 mywebserver 로 설정

  • #docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04
    • #apt-get update
    • apache2 설치 / 서비스 시작
    • root@ad9a108749e2:/# apt-get install -y apache2
    • service apache2 start

우분투 container 생성 후 접속 ( 이름 지정, 포트 지정, 14.04 버전 )

  • docker run -it --name mywebserver -p 80:80 ubuntu:14.04
  • apt-get update
    • update 이후
  • apt-get install -y apache2
    • apache2 다운로드
  • service apache2 start
    • 서비스 동작 실행

*컨테이너 start , stop , restart , kill ( 아래 명령어 실행하고 결과 확인 )

docker kill testweb ⇒ -9 생략된것 .
docker ps ⇒ Exited(137) 강제종료 137로 표시됨
docker kill -s 15 testweb -> 15은 stop 명령어와 동일 ⇒ Exited(0)

docker top 명령어와 kill 명령어 (container)

  • 도커 상태 확인
  • restart하면 PID, PPID가 바뀐다
  • kill 명령어로 삭제 가능 , -9 옵션 생략 ( 상태: Exited (137), docker ps -a 하면 볼 수 있다 )
  • kill 명령어 옵션: -s 15 ( 동작을 멈추는 것, 상태: Exited (0) )
  • docker 강제 삭제 명령어, 시스템에 좋지는 않다 ( docker rm -f )

-볼륨 관리( 데이터 저장소 )

  • ⇒ 컨테이너가 호스트 시스템에 파일을 저장 할 수 있음.
    중지 후에도 파일이 유지. volume, bind mounts, tmpfs mount

*볼륨 생성 및 확인

-volume 방식

  • ⇒ volume 이라는 이름의 저장소를 만들고 mysql과 연동 시키기
  • ⇒nginx 이미지로 demodb1,2 컨테이너 생성하면서 testvol, newvol 과 마운트 시키기
    • docker run -d --name demodb1 -v testvol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7
    • docker run -d --name demodb2 -v newvol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7
    • docker rm -v -f demodb3
    • docker container rm -f demodb1 demodb2

볼륨 생성 확인

  • 볼륨 생성 ( docker volume create ), 생성된 볼륨 리스트 확인 ( docker volume ls )
  • 볼륨의 세부 정보 확인 ( inspect )
  • Mount point 지점 확인 ( /var/lib/docker/volumes )

container와 연결 ( volume(저장소)를 만든 후 mysql과 연결 )

  • MySQL 5.7 이미지를 사용하여 "testvol"이라는 볼륨을 사용하여 데이터를 영구적으로 저장하는 "demodb1"이라는 이름의 컨테이너 생성
  • MySQL 5.7 이미지를 사용하여 "newvol"이라는 볼륨을 사용하여 데이터를 영구적으로 저장하는 "demodb1"이라는 이름의 컨테이너 생성
  • 생성된 컨테이너와 볼륨 확인 ( docker inspect demodb1로 볼륨과의 마운트 확인 )

마운트 확인

  • mysql 이미지 다운로드
  • mysql:5.7의 볼륨 설정을 확인 ( "Volumes" 섹션에서 "/var/lib/mysql" 경로가 비어있지 않고, 빈 객체로 표시, 해당 경로가 볼륨으로 설정되어 있음 )
  • 컨테이너 삭제 (docker container rm -f)
  • 볼륨 삭제 (docker volume rm -f)

*bind mount 방식으로 볼륨 관리

-시스템 내 아무곳에나 저장 가능 하기에 중요한 파일 보관시 좋음.

*bind mount 방식 생성 3가지 방식

  • [root@www ~]# docker run -d --name w1 -v /web:/usr/share/nginx/html:ro nginx
  • [root@www ~]# docker run -d --name w2 -v /usr/share/nginx/html nginx
  • [root@www ~]# docker run -d --name w3 -v /web/usr/share/nginx/html nginx
    • w1, 2, 3 은 컨테이너

bind 방식 ( 볼륨 관리 )

  • "nginx" 이미지를 사용하여 호스트의 "/web" 디렉토리를 컨테이너 내부의 "/usr/share/nginx/html" 디렉토리에 읽기 전용으로 마운트하는 것( 컨테이너를 백그라운드에서 실행 )
  • volume 생성 방식과 차이점은 volume을 생성하지 않고 컨테이너를 바로 생성
  • 호스트의 "/usr/share/nginx/html" 디렉토리를 컨테이너 내부의 동일한 경로에 마운트합니다( name: w2 )
  • 호스트의 "/usr/share/nginx/html" 디렉토리를 컨테이너 내부의 동일한 경로에 마운트합니다( name: w3 )
  • 생성된 볼륨 확인

*생성한 컨테이너와 볼륨 삭제

  • #docker rm -f $(docker ps -aq) ⇒ q:컨테이너ID
  • #docker volume rm -f $(docker volume ls -q)

컨테이너와 볼륨 삭제

  • 생성된 컨테이터 삭제 ( 한번에 )
  • 생성된 볼륨 삭제 ( 한번에 )

0개의 댓글