os 설치
실행환경 세팅(python)
어플리케이션 코드(또는 빌드) 다운로드
library 다운로드
등등보안 결함
❌새로운 코드
또는 라이브러리
추가 가능스크립트
를 작성해 사용하게 된다.운영체제 변경
, 사용 언어의 버전 관리
, 실행환경 세팅 언어 변경
등의 여러 요청들이 생기게 된다.인프라 관리
와 어플리케이션 작성
을 분리해보자!도커 이미지
라는 것을 만들어 실행환경, 실행하는 코드, 필요한 라이브러리, 설정 파일
을 한 곳에 정의해 주었다.이미지를 실행
하기만 하면 된다.image
: 어플리케이션을 실행하기 위한 필요한 모든 것이 생성되어 있는 파일container
: image를 사용하여 실행한 것docker object(image, container등)를 관리
cli(Command-line interface)
가상 머신(VM; Virtual machine)
기술이 있다.하이퍼바이저
를 사용해서 여러개의 운영체제를 하나의 호스트에서 생성해 사용
하는 방식$ docker
$ docker ps
Unable to find image 'docker/getting-started:latest' locally
라는 메세지가 나와 당황했는데, 그냥 가만히 있으면 결과에서 보이는 것과 같이 뭔가를 pull해오면서 알아서 세팅해준다.$ docker run -d -p 80:80 docker/getting-started
localhost
만 입력하면 아래와 같은 튜토리얼 화면이 나오게 된다.Unable to find image 'docker/getting-started:latest' locally
doker image 목록
에 docker/getting-started
라는 이름의 이미지가 없다는 뜻이었다. docker registry
에서 해당 이미지를 찾았고, 찾은 이미지를 로컬로 다운로드 받게 된다.doker run
이라는 명령어를 통해 container를 생성해 위의 브라우저 화면을 보여주게 되는 것이다.$ docker run [options] {image_name} [command]
docker run
: docker image를 사용해서 container를 실행하는 명령어options
에는 무엇이 있을까?$ docker run --help
$ docker run -d -p 80:80 docker/getting-started
-d
: detach option이며, 실행한 docker container가 백그라운드에서 실행되도록
하여 컨테이너가 실행되는 프로세스를 커맨트창에 보여지지 않도록 해준다. -p
: publish라는 옵션이며, 기본적으로 docker/getting-started
는 웹 서비스이다보니 80번 포트를 제공받아 사용되고 있는데, 우리는 localhost에서도 접속을 해야 하므로 80번 포트와 localhost를 연결
해 주는 명령어이다.80:80
$ docker ps
CONTAINER_ID
: 도커가 실행될 때마다 받는 고유 ID 값IMAGE
: docker container를 띄울 때 사용된 이미지COMMAND
: container가 실행될 때 어떤 커맨드를 주었는지CREATED
: 얼마 전에 생성되었는지STATUS
: 지금 상태가 어떤지PORTS
: publish option에서 주었던 80포트와 80포트가 연결되는 부분NAMES
: container의 이름kill
$ docker kill {container_id|conatinaer_name}
SIGKILL
이라는 신호를 보냄stop
$ docker stop {container_id|conatinaer_name}
SIGTERM
이라는 신호를 보냄CONTAINER_ID
를 같이 입력해주면 된다.$ docker stop f6a574ab40d8(CONTAINER_ID)
docker ps
의 경우, 현재 실행중인 container에 대한 정보를 보여주기 때문에 주의해야 한다. $ docker ps -a
STATUS
를 보면 언제 멈췄는지 볼 수 있다. $ docker restrat CONTAINER_ID
$ docker exec [options] {container_id|container_name} [command]
$ docker exec CONTAINER_ID ls
$ docker exec -ti CONTAINER_ID sh
-ti
option에 대해 알아보자.$ docker exec --help
-ti
는 -i
와 -t
가 합쳐진 옵션이다.-i
: interactive option으로 shell script를 사용하려면 input을 받아야 하는데, localhost에서 입력한 input을 container에서도 사용하겠다는 뜻-t
: tty option으로 터미널 환경을 만들어서 shell script를 쓸 수 있도록 해줌ls
를 통해 확인한 폴더 구조에서 초록색 부분을 확인해보자. $ cat docker-entrypoint.sh
$ exit
4 docker rm CONTAINER_ID
컨테이너가 실행되고 있는지
를 확인해봐야 한다. docker image
를 만들기 위해서는 dockerfile
이 필요하다. dockerfile
: docker image를 어떻게 생성할 것인지를 정의한 파일FROM python:3.8
ADD requirements.txt .
RUN pip install -r requirements.txt
ADD templates ./templates/
ADD app.py .
CMD ["python", "app.py"]
이미지를 생성할 때는 어떤 이미지를 먼저 생성할 것인지에 대한 순서
가 중요하다. 각 순서에 대한 설명을 해보도록 하겠다.
FROM python:3.8
: 우리는 현재 flask를 사용할 것이고, flask는 python 환경에서 실행된다. 따라서 3.8 버전의 python을 dockerimage의 기본 이미지로 사용하기 위해 위와 같이 작성한다.
FROM
: Docker image를 생성할 때 기본으로 사용할 base image를 적는 부분ADD requirements.txt .
: .
위치에 requirements.txt 파일을 저장한다.
ADD src dst
: 호스트 머신에 있는 파일이나 폴더를, dst라는 위치에 저장RUN pip install -r requirements.txt
: shell에서 해당 커맨드를 실행해서 환경을 만들겠다.
RUN script
: script를 실행한다.CMD ["python", "app.py"]
: ["python", "app.py"] 명령어를 기본적으로 실행한다. 즉 별다른 커맨드가 없다면 해당 커멘드가 자동적으로 실행되게 된다.
CMD
: 생성된 docker image를 실행할 때 자동으로 실행되는 커맨드이다. build
문법에 대해 알아보도록 하겠다. $ docker build [OPTIONS] PATH
-t
: image에 원하는 이름을 붙일 수 있다. {image_name}:{tag}
의 형태로 사용하며, {tag}를 붙이지 않을경우 자동으로 latest가 됩니다.docker scan
: 이미지에 보안 결함이 있는지 확인해주는 커맨드.
: docker build를 어느 위치에서 실행할 것인지 정의
합니다. 이 위치에 따라 ADD 커맨드에서 호스트의 파일 위치를 사용하는게 바뀔 수
있습니다.$ docker build .
dockerfile
이 있는 폴더 안에서 진행해야 한다.$ docker images
$ docker build -t docker-memo:version1 .
$ docker history docker-memo:version1
명령어를 하나씩 실행할 때마다 우리가 원하는 이미지가 생성
된다.$ docker run docker-memo:version1
$ docker run -d -p 5000:5000 docker-memo:version1
<body>
<div class="wrap">
<div class="jumbotron">
<h1 class="display-4">ㄴㅐ꺼야 링크 메모장!</h1>
<p class="lead">내용 바꿨어 ㅋ</p>
...
-t 옵션
을 사용할 때 동일한 image_name:tag 를 사용
할경우 override되므로 주의해야 한다.CACHED
가 붙게 된다.$ docker build . -t docker-memo:version2
$ docker run -d -p 5000:5000 docker-memo:version2
$ docker run -d -p 80:5000 docker docker-memo:version2
localhost와 5000번 포트를 연결하였으니, 브라우저로 가 localhost
만 쳐도 해당 페이지가 나오는지 확인해보도록 하겠다.
아까 실습했던 화면이 나와버렸다. 당황하지 않고 아래의 순서에 따라 cache를 지워주면 된다.
캐시 사용 중지
를 선택해준다.변경했는데 안되서 이것저것 해보다보니 갑자기 변경이 되었다.
이제 localhost
를 브라우저에 입력해주면 사이트가 나온다.
docker image의 이름이 repository와 같아야 한다
는 점이다.$ docker build -t wjdeorms27/docker-practice:1.0.0 .
$ docker login
# 후에 나오는 username, password에 치면 됩니다!
$ docker push {user_id}/docker-practice:1.0.0
$ docker rmi IMAGE_ID:TAG
$ docker pull {user_id}/{repository_name}:{tag}
$ docker run -d -p 5000:5000 IMAGE_ID:TAG
$ docker build . <<< dockerfile이 있는 위치에서 해야함!
$ docker images
$ docker build -t homework:1.0.0 .
$ docker images <<< image가 잘 생성되었는지 확인하기!!
$ docker run -d -p 5000:5000 homework:1.0.0
$ docker ps