0부터 시작하는 Docker 공부 - 도커 이미지 다루기

Jaehong Lee·2022년 8월 17일
0
post-thumbnail
  • 도커 이미지 : 도커 이미지란 컨테이너 실행에 필요한 모든 파일과 설정 값 등을 포함하고 있는 파일

1. 이미지의 상세 정보

  • inspect 를 사용하면 상세 정보를 확인 가능하다

  • 저장소 다이제스트 값을 사용하면 똑같은 이미지를 사용할 수 있다

  • 외부에 공개된 Port 도 확인 가능하다
  • cmd 는 해당 이미지를 이용하여 컨테이너로 배포하면, 처음 시작되는 명령
    • 위 명령은 nginx daemon 을 시작시키는 명령어이다

  • cmd 와 비슷하게 처음 컨테이너가 시작되면 동작시키는 명령어
  • Layer : 도커의 이미지는 처음 만든 이미지를 기준으로 이후 추가되는 내용을 Layer 형태로 얹게 된다

    • 이미지를 수정 및 추가하여, 다시 도커 허브에 push 할 때, 만약 전체를 다 저장하면 도커 허브의 용량에 문제가 생긴다
    • 최초 이미지를 base 로 하여, 추가되는 내용만 저장한다. 이는 적은 용량이므로 이미지를 수정 및 추가하여도, 용량 문제가 없다. 이러한 추가되는 내용은 layer 형태로 쌓이게 된다. 위의 layers 를 확인하면, 여러 추가된 내용들이 layer 형태로 쌓여있는 것을 확인할 수 있다

2. 이미지 이름 수정 및 업로드

  • 새 레포지토리를 생성해주자
  • 이 명령어를 잘 기억하자. 위의 지정된 것과 동일하게 이름과 TAG 를 지정해야 레포지터리에 업로드가 가능하다
  • 로컬 레지스트리에 있는 최신 nginx 이미지를 이용해 lijahong/mynginx:blue & green 이라는 이미지를 생성했다
  • 이미지 리스트를 확인하면, 이는 모두 하나의 같은 리스트 임을 확인할 수 있다
  • push 를 통해 생성한 레포지터리에 업로드 하자
  • 잘 업로드 된 것을 확인할 수 있다

3. 이미지 생성

  1. 동작 중인 컨테이너를 commit 하여 이미지로 만든다
  2. Docker File 을 이용하여 베이스 이미지 지정, 추가 패키지 선택, 컨테이너로 동작시 실행할 명령어등을 지정한 뒤 이를 build 하면 로컬 저장소에 이미지가 생성된다
  • 컨테이너 조회 명령어 두 가지

    docker ps = docker container ls

docker container run 옵션

  • i : 대화식 모드 열기

  • t : 단말 디바이스 제공 ( 마치 ssh 연결하는 것과 같은 기능 ) . it 옵션은 함께 사용하는 경우가 많다

  • d : 생성된 컨테이너를 백그라운드에서 동작시킨다. 주로, 데이터 베이스나 웹 서버와 같이 생성된 컨테이너로 관리자가 즉시 진입할 필요가 없는 경우에 많이 사용한다

  • name : 생성된 컨테이너는 기본적으로 id 를 부여받고, 이중 12자리를 이용하여 관리할 수 있다. 하지만, 간단히 이름을 이용하여 관리하고자 하는 경우에는 --name 을 이용하여 컨테이너의 이름을 부여할 수 있다. 단, rename 을 이용하여 나중에 변경할 수도 있다

    • 단, 동시에 다수의 컨테이너 ( 동일한 기능을 수행하는 ) 를 생성하는 경우에는 이름을 지정하는 것이 불필요한 작업이다. 만약, 이름을 부여하지 않으면, 자동으로 임의의 이름이 부여된다
  • hostname : 컨테이너 내에서 사용하는 컨테이너의 호스트 이름. 이 역시 지정하지 않으면, 자동으로 ID 값이 호스트 이름으로 사용된다

  • rm : 삭제

  • env : 컨테이너 내에서 사용할 시스템 환경 변수를 지정할 수 있다

  • v ( --volume ) : 볼륨 mount 하는 옵션. 호스트의 특정 디렉터리와 컨테이너의 특정 디렉터리를 마운트할 때 사용하거나, 별도의 볼륨을 만들어서 연결하는 방식으로도 사용된다

    • 디렉터리 마운트 방법은 파일을 영구적으로 저장할 수 없다. 새 host 에서 컨테이너가 시작됬을때 이전에 다른 host에 저장된 파일을 불러올 수 없기 때문이다
    • 외부 Storage Volume 과 mount 하면 영구적인 파일 저장이 가능해진다. 이를 위해선 iscsi 방식을 사용 해야 한다
  • 일반적으로 둘을 구분할 때 아래와 같이 작성한다

    • 디렉터리 마운트 : /home/rapa:/home/root
    • Volume 마운트 : myvolume:/root
    • 위의 Volume 은 클라우드에서 매우 중요하다. 이는 후에 쿠버네티스에서 나오는 PV / PVC 와 연관되있다
  • p : Host 의 특정 포트와 컨테이너의 특정 포트를 매핑할 때 사용한다 ( 주로 사용한다 )

  • P : 컨테이너에서 노출한 특정 포트를 Host 의 임의의 포트와 자동 매핑해준다

  • link : 두 개 이상의 컨테이너를 연결하는 방법

    • 도커에는 자체 dns 가 있어서, 이름을 이용한 링킹이 가능하다. 주로, 외부에 노출되지 않은 데이터 베이스와 같은 경우 웹 컨테이너와 연결할 때 사용한다

4. 데이터 베이스 이미지 사용해보기

  • 데이터 베이스를 사용하는 방법
    1. 서버를 준비 - os 를 설치 -> mysql 을 설치 ( bare metal 방식 )
    2. aws 에 접속 - rds 서비스 신청 ( os 는 Amazon linux 로 제공되지만, os 로의 접근은 되지 않는다 ) -> 이렇게 애플리케이션의 설치 과정 없이, 신청 즉시 해당 애플리케이션으로 접속할 수 있는 서비스를 완전 관리형 서비스 하고 한다
    3. 도커를 이용하여 신청한다. 즉시 제공된다. 만약, 모든 개발자들이 동일 버전의 개발 환경이 필요하다면, 컨테이너를 이용한 개발이 유용하다

  • mysql 5.7 버전 이미지를 pull 하자

  • https://hub.docker.com/_/mysql 에 접속하여 mysql 의 offical image 의 문서를 확인하자. 여기서 Environment Variables ( 환경 변수 ) 키워드를 확인하자

  • 외부로 열려있는 포트 번호를 확인하자

Quiz

  • 위 요구사항에 맞게 컨테이너를 생성해보자
  • 접속을 위한 mysql 클라이언트 프로그램을 다운 받자
docker container run -d --name mydb -p 33061:3306 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=testdb mysql:5.7
  • 위와 같이 입력하여 컨테이너를 생성 및 실행하자
  • 위와 같이 접속하면 잘 접속된다

볼륨 옵션 추가

  • 위에 생성한 컨테이너를 제거해주자
docker container run -d --name mydb -p 33061:3306 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=testdb -v /home/rapa/mydb:/var/lib/mysql --restart=always mysql:5.7
  • 위와 같이 v 옵션과 restart 옵션을 추가해주자

  • 생성 후 Host 에 /home/rapa/mydb 디렉터리가 생성된 것을 확인 가능하며, 이 디렉터리는 mysql 컨테이너와 mount 되었다. 이제 DB 에 추가되는 사항들은 이 디렉터리에 저장된다

  • testdb 관련 Data 는 위에 저장된다

  • --restart=always 를 사용하면, 도커 데몬이 재시작될때 자동으로 해당 컨테이너를 실행시킨다. 만약, 옵션이 없다면, 컨테이너는 종료된 상태가 된다

  • 다음 두 가지 컨테이너를 생성하자
docker container run -d --name wpdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress --restart=always mysql:5.7

docker container run -d -e WORDPRESS_DB_PASSWORD=password \
>  --name wordpress --link wpdb:mysql -p 80:80 wordpress
  • mysql 이미지로 컨테이너를 하나 생성하고, wordpress 이미지로 컨테이너를 하나 생성하는데 wpdb 와 link 해준다
    • wpdb:mysql 은 wpdb 의 별칭을 지정해준 것으로, wpdb 를 mysql 이라고 불러도 되게 alias 해준 것 이다

  • Host 의 80 번 포트로 접속하면, db 연결 오류가 난다
docker container run -d -e WORDPRESS_DB_PASSWORD=password -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=root --name wordpress --link wpdb:mysql -p 80:80 wordpress
  • wordpress 컨테이너 생성 코드를 수정하자. DB 이름과 DB 유저를 추가 해야 한다
  • 재접속하면 DB 와 잘 연결되어 워드 프레스가 서비스된다
  • 잘 서비스 된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글