프로세스 격리 기술
들을 사용해 container로 실행하고 관리
하는 오픈 소스 프로젝트docker container
는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것
을 포함하는 완전한 파일 시스템 안에 감싼다.서버에 설치되는 무엇
이든 포함한다.실행 중인 환경에 관계 없이
언제나 동일하게 실행될 것을 보증한다.getting-started
이미지를 80번 포트에 연결해 이미지를 확인해보자. $ docker run -d -p 80:80 docker/getting-started
>>> -d : image를 돌리면서 터미널을 사용하겠다.
>>> -p : port 연결
>>> docker/getting-started : docker hub의 docker 레지스트리에 있는 getting-started 라는 image를 사용하겠다.
(image 뒤에 tag를 붙이지 않으면 자동적으로 latest가 붙음)
내 로컬에 존재하지 않는다면
, image를 다운받아서 실행
한다. 따라서 처음 실행때 시간이 좀 걸릴 수 있다.docker desktop
에서 확인하는 것이다.terminal
에서 아래의 명령어를 입력해 확인하는 것이다.$ docker ps
localhost:80
을 주소창에 입력한 후 엔터를 치면 아래의 화면을 볼 수 있다.node.js
를 사용하고 있다. Dockerfile
을 생성하도록 하겠다. # 현 application은 javascript로 만들어졌다.
# 따라서 그것을 돌리기 위한 엔진인 node를 받아오고, 그것의 버전으로 12를 사용하는데
# 경량화된 버전인 alpine을 사용한다.
FROM node:12-alpine
# 애플 m1 MacBook을 사용하기 때문에 추가해줌
RUN apk add --no-cache python2 g++ make
# 현 application을 실행할 곳은 container의 app 폴더 안 이다.
WORKDIR /app
# 현 application 안에 있는 것을 워킹 디렉토리의 /app 안으로 복사해 주겠다.
COPY . .
# 실행
# yarm instal은 pip install과 동일하다고 보면 됨
RUN yarn install --production
# node를 실행하며, src 파일 안에 있는 index.js를 실행시킨다.
CMD ["node", "src/index.js"]
내가 만든 Dockerfile이 있는 곳에서만 image가 생성
된다는 것이다. 다른 곳에서 하면 무조건 안 된다.$ docker build -t getting-started .
>>> -t : tag를 붙여줌
>>> . : 현재 파일에서 Dockerfile을 찾아라
latest
가 자동적으로 붙는다. 실제 본인의 프로젝트를 image로 만든다면 getting-started:1.0.0
과 같이 버전을 붙여주는 것이 이상적일 것이다.$ docker run -dp 3000:3000 getting-started
$ docker ps
localhost:3000
을 입력하면 다음과 같은 페이지가 나오게 된다.New Item
이 있고, 버튼에는 Add Item
이 있다. src/js/app.js
파일의 99 번째 줄과 109 번째 줄을 한글로 수정해보자.새로운 image
를 생성해 다시 container를 돌리는 방법이 있다.<none>
으로 변경된다.$ docker build -t getting-started .
$ docker run -dp 3000:3000 getting-started
위의 결과에서 보이다싶이 이미 우리는 3000번 포트를 사용하고 있다.
docker ps
로 바로 찾을 수 있다.$ lsof -i :3000
나는 이전 container를 삭제하고 새로 만든 container를 돌려보도록 하겠다.
docker ps
로 찾을 수 있다.)$ docker stop {container_id}
docker ps -a
를 통해 멈춰있는 container들을 확인할 수 있는데, 방금 전 멈춘 container가 아직도 있는 것을 알 수 있다.$ docker rm {container_id}
$ docker rm -f {container_id}
$ docker run -dp 3000:3000 getting-started
$ docker ps
브라우저로 돌아가 적용이 잘 되었는지 확인해보도록 하겠다.
작동은 잘 되지만 불편한 점이 많았다.
Docker Commands
를 살펴보도록 하자. $ docker push {user_id}/{image_name}:{tagname}
>>> tagname : image의 특정 버전을 쓸 수 있으며, 쓰지 않으면 latest가 된다.
wjdeorms27/getting-started
라는 이름의 image가 내 로컬에 존재하지 않기 때문이다.$ docker tag getting-started {user_id}/getting-started
$ docker login -u {user_id}
start
버튼이 있고, 이것을 누르면 아래 화면으로 들어가진다. 여기서 빨간 박스를 클릭해 인스턴스를 추가하면 된다.$ docker build --platform=linux/amd64 -t {user_id}/{image_name}:amd64 .
>>> tag는 알아보기 쉽게 amd64로 선택
$ docker push wjdeorms27/getting-started:amd64
3000
번 포트가 생기게 된다. 이것을 누르면 우리가 만든 application을 확인할 수 있다.$ docker rm -f {container_id}
$ docker rmi {image_id}
volume
을 만들어 사용해보자.$ docker volume create {volume_name}
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
>>> -v : 볼륨을 연결한다.todo-db를 연결할 건데 위치는 /etc/todos이다.
$ docker volume ls
Mountpoint
에 위치하고 있다. $ docker volume inspect todo-db
이전까지는 파일의 사소한 변화에도 image를 다시 빌드하고 container를 다시 띄우고하는 등 많은 변화를 필요로 했었다.
이러한 변경 활동을 하지 않아도 되는 방식을 소개하겠다.
우리가 맨 처음 받아와 사용하던 application을 volume처럼 사용해 container에 탑재하게 된다면 파일에 수정 사항이 생기더라도 위와 같은 노동을 하지 않아도 된다.
실습에 앞서 현재 돌아가고 있는 container들을 모두 꺼주자.
bind mount를 하기 위해서는 우리의 프로젝트가 있는 파일로 이동해주어야 한다.
bind mount의 3 가지 명령어
백슬래시(\)
를 사용해 다음 줄로 넘어가자!기본
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "yarn install && yarn run dev"
파워쉘
docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
node:12-alpine `
sh -c "yarn install && yarn run dev"
애플 실리콘 (m1)
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "apk add --no-cache python2 g++ make && yarn install && yarn run dev"
>>> $(pwd) : 현재 폴더를 입력하는 것이다. 현재 Dockerfile이 있는 곳을 입력해주어야 한다.
해당 명령어를 그대로 입력하면 됨.
나의 경우 해당 명령어를 입력하면서 에러가 났다. 만약 맥북인데 에러가 난다면 시스템 환경설정 > 보안 및 개인 정보 보호 > 전체 디스크 접근 권한 > docker 체크하기
의 순으로 권한을 부여하면 된다.
위의 코드를 실행하면 다음과 같이 된다.
$ docker logs -f {container_id}
>>> 실시간으로 생성되는 것을 확인할 수 있음
>>> -f가 없으면 잠깐의 log만 나옴
완벽하게 만들어졌으면 아래의 화면이 나오게 된다.
Listening on port 3000
이 보이게 되면 control + c
를 눌러 logs에서 빠져나오면 된다.그리고 docker desktop에서 확인해보면 container가 돌아가고 있는 것을 볼 수 있다.
브라우저를 확인해보자.
잘 돌아가니 이제 마지막으로 영어인 부분을 한글화해보도록 하겠다.
위와 같이 수정한 후 저장하고, 브라우저에 가서 새로고침을 하면 변경된 부분이 바로 적용되는 것을 확인할 수 있을 것이다.
$ docker network create todo-app
mysql container
를 만들어서 현재 만든 network에 attach해보도록 하겠다.
대다수의 경우
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
>>> --network-alias : 네트워크의 이름을 설정해줄 수 있음
>>> -v todo-mysql-data:/var/lib/mysql : 볼륨을 따로 만들지 않아도 다음과 같이 쓰면 자동으로 생성해줌
그리고 저장할 위치를 작성하면 됨
>>> MYSQL_ROOT_PASSWORD= : mysql에 접근할 때 필요한 비밀번호 설정
>>> MYSQL_DATABASE= : 데이터베이스 이름을 설정해줌
>>> mysql:5.7 : 사용할 mysql 버전
만약 나와 같이 m1 노트북이라면 추가로 설정할 부분이 있다.
$ docker run -d \
--network todo-app --network-alias mysql --platform linux/amd64 \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
docker desktop으로 가 container가 실행되는 것을 확인해보자.
이제 데이터베이스를 확인하도록 하자.
$ docker exec -it {container_id}
$ docker run -it --network todo-app nicolaka/netshoot
>>> nicolaka/netshoot : https://github.com/nicolaka/netshoot의 이미지 사용
dig mysql
명령어를 입력하면 아래의 화면이 나온다. 172.18.0.2
포트에 DNS처럼 연결된 것을 볼 수 있다.$ docker run -dp 3000:3000 \
> -w /app -v "${pwd}:/app" \
> --network todo-app \
> -e MYSQL_HOST=mysql \
> -e MYSQL_USER=root \
> -e MYSQL_PASSWORD=secret \
> -e MYSQL_DB=todos \
> node:12-alpine \
> sh -c "yarn install && yarn run dev"
docker logs {container_id}
를 통해 잘 연결이 되었는지 확인할 수 있다. $ docker exec -it {container_id} mysql -p todos
$ select * from todo_items;