
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' locallydoker 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