Skip to main content

Docker Mongo

Dockerfile의 모든 내용을 알면 좋겠지만 이미 잘 구성된 내용이 있기 때문에 그 정보를 이용한다.

Docker Library에 이미 버전별로 docker image를 만들기위한 Dockerfile이 만들어져 있다.

docker 기본 명령#

  • docker build : Dockerfile로 부터 image 빌드하기
  • docker images : show images
  • docker rm : remove container
  • docker rmi : remove images
  • docker ps : show container process
  • docker run : instance 가동
  • docker exec : 실행중인 container 내부에 명령을 실행
  • docker stop : container 실행 중지

docker image build#

로컬파일로 build하기#

원하는 버전의 폴더에 들어가서 Dockerfileentrypoint.sh 두 개의 파일을 가져온다. window는 shell script 파일은 없다.

두 파일을 다운로드한 폴더에서 아래 명령을 실행한다. docker images 명령으로 모든 image 목록을 조회한다.

docker build -t mongo:4.0xenial .
docmer images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo 4.0xenial 82f64ab14ab3 About a minute ago 382MB
ubuntu xenial 4a689991aa24 3 weeks ago 116MB

git 저장소 url로 build하기#

또는 아예 Dockerfile이 있는 Url경로를 지정해도 된다.

docker build -t=mongo:git4.1xenial https://github.com/docker-library/mongo.git#master:4.1
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo git4.1xenial 89735d5e8230 12 seconds ago 390MB
mongo 4.0xenial 82f64ab14ab3 16 minutes ago 382MB
ubuntu xenial 4a689991aa24 3 weeks ago 116MB

docker pull명령으로 build하기#

library라고 하는 곳에 tag를 붙여서 image를 만들어 두고 pulling 하는 방식.

library/mongo:tags

docker pull mongo:4.0-xenial
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo git4.1xenial 89735d5e8230 3 minutes ago 390MB
mongo 4.0xenial 82f64ab14ab3 18 minutes ago 382MB
mongo 4.0-xenial ea6441073322 5 days ago 382MB
ubuntu xenial 4a689991aa24 3 weeks ago 116MB

이 명령은 다 만들어진 image를 가져오는 방법이기 때문에 실패가능성이 낮고 빠르게 설치를 완료할 수 있다.

image를 이용해 container instance 만들기#

아래 명령으로 새로운 instance를 만들고 실행한다.

docker run --name docker-mongo -d mongo:4.0-xenial
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9eb3ddb3117f mongo:4.0-xenial "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 27017/tcp docker-mongo

구동중인 container에 명령 실행#

docker exec -it docker-mongo bash

mongod 를 실행할 수도 있다.

docker-mongo db에 연결하기#

외부(host)에서 docker-mongo의 db에 연결하려면 port를 publish해 주어야 한다.

docker run --name docker-mongo -p 27017:27017 -d mongo
$ mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.4
WARNING: shell and server versions do not match
Server has startup warnings:
2018-11-16T02:44:05.418+0000 I STORAGE [initandlisten]
2018-11-16T02:44:05.418+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-11-16T02:44:05.418+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-11-16T02:44:05.891+0000 I CONTROL [initandlisten]
2018-11-16T02:44:05.891+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-11-16T02:44:05.891+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-11-16T02:44:05.891+0000 I CONTROL [initandlisten]
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

연결정보를 알기 위해 inspect명령을 이용해 mongo가 들어 있는 container의 정보를 확인할 수도 있다.

docker inspect docker-mongo

container, image 중지, 제거#

!!! 이 명령 실행은 주의 해야 한다. 이미지를 지울때 디스크도 지워질 수 있다.

container의 실행을 중지시키려면 docker stop명령을 쓴다. 중지상태의 모든 container를 보려면 docker ps -all 옵션을 사용한다.

docker stop docker-mongo
docker ps -all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9eb3ddb3117f mongo:4.0-xenial "docker-entrypoint.s…" 8 minutes ago Exited (0) 6 seconds ago docker-mongo

container, image 지우기

docker rm docker-mongo
docker rmi mongo:git4.1xenial
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mongo 4.0xenial 82f64ab14ab3 41 minutes ago 382MB
mongo 4.0-xenial ea6441073322 5 days ago 382MB
ubuntu xenial 4a689991aa24 3 weeks ago 116MB

docker image를 aws container에 올리기#

  • aws ecs 에 registry만들기(ecr)
  • aws cli로 aws ecs get-login 명령 실행 - docker login
    • aws ecr 페이지에 보면 명령을 예시한 부분이 있는데 이걸 그대로 사용하면 안된다.
    • 예시로 제시된 명령의 서버 경로에 문제가 있다. 이건 아마도 현재 로컬에 저장된 aws의 config를 기준으로 get-login 명령에 의해 login 정보가 생성되기 때문인것 같다.
    • $(aws ecr get-login --no-include-email --region ap-northeast-2 --registry-ids 489848783055)
    • registry id를 직접 입력해 주어야 한다.
    • 그런데 로컬에서 사용중인 사용자와 push 할 ecr의 계정이 일치하지 않는 경우 권한 오류 발생한다.
    • 이 경우 해당 사용자의 계정으로 로그인 문자를 만들어주기 위해 --profile 을 사용한다.
    • 로컬에 profile 추가하는 방법은 https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-getting-started.html
    • 결론은 최종 로그인 명령은 $(aws ecr get-login --no-include-email --region ap-northeast-2 --registry-ids 489848783055 --profile user2) 가 되겠다.
  • 일단 ecr에 push 하기 위한 image를 tagging 해야 한다.
    • docker tag mongo:latest 489848783055.dkr.ecr.ap-northeast-2.amazonaws.com/onlydel-test-repo:latest
  • ecr에 push
$ docker push 489848783055.dkr.ecr.ap-northeast-2.amazonaws.com/onlydel-test-repo:latest
The push refers to repository [489848783055.dkr.ecr.ap-northeast-2.amazonaws.com/onlydel-test-repo]
92f864a6c481: Pushed
7332e2868699: Pushed
c34e538e0b14: Pushed
2f469519e51f: Pushed
589a870a78f6: Pushed
04696c7269db: Pushed
e582e2b6fecd: Pushed
9772dbd1a936: Pushed
fe88aff8ea8c: Pushed
f1dfa8049aa6: Pushed
79109c0f8a0b: Pushed
33db8ccd260b: Pushed
b8c891f0ffec: Pushed
latest: digest: sha256:851b20be46552fa884451c5b46928c1b0167aec2eea40a41ab22705e23cf3ccc size: 3028

이후 작업들#

  • ecs cluster 만들기
  • service 만들기
  • service task 정의

cluster, service, task를 만드는 작업은 겉으로보기엔 굉장히 평온해 보이지만 내부적으로 많은 리소스의 생성과 설정작업이 연관되어 있다. 이 복잡한 작업들을 한 번에 모두 이해할 수는 없지만, 전체적인 흐름과 구조를 파악하고 있어야 한다.

service, task의 생성으로 자동 발생한 route53 hosted-zone의 삭제 이슈#

어떤 절차에 의해 삭제를 해야 하는건진 모르겠지만, 일단 남아 있는 hosted-zone을 콘솔에서 지우지 못하는 문제가 있다. 이 놈들은 aws cli를 통해 service영역을 삭제해야 한다.

$ aws servicediscovery list-services
{
"HostedZones": [
{
"Id": "/hostedzone/ZXITJATFKJVPJ",
"Name": "local.",
"CallerReference": "asb3umuah6sbko27nphed6g7qvmdijnk-jojr8t97",
"Config": {
"Comment": "Created by Route 53 Auto Naming",
"PrivateZone": true
},
"ResourceRecordSetCount": 2,
"LinkedService": {
"ServicePrincipal": "servicediscovery.amazonaws.com",
"Description": "arn:aws:servicediscovery:ap-northeast-2:489848783055:namespace/ns-zkd55dxdomyjwwqq"
}
},
{
"Id": "/hostedzone/Z5OYE46DDOR0M",
"Name": "realdesk.",
"CallerReference": "2uzzjpvtjplzj73lf6pjv5krt3hbl4kt-joo4pq93",
"Config": {
"Comment": "Created by Route 53 Auto Naming",
"PrivateZone": true
},
"ResourceRecordSetCount": 2,
"LinkedService": {
"ServicePrincipal": "servicediscovery.amazonaws.com",
"Description": "arn:aws:servicediscovery:ap-northeast-2:489848783055:namespace/ns-r7oj2i6zpksmrkvk"
}
}
]
}
# delete services
$ aws servicediscovery delete-service --id=srv-yzmdk2ybehmibu3w
$ aws servicediscovery delete-service --id=srv-m2vpzhzmjmes2vta
$ aws servicediscovery delete-service --id=srv-4yfuswr7xgmogccc
# list-services
$ aws servicediscovery list-services
{
"Services": []
}
$ aws servicediscovery list-namespaces
{
"Namespaces": [
{
"Id": "ns-r7oj2i6zpksmrkvk",
"Arn": "arn:aws:servicediscovery:ap-northeast-2:489848783055:namespace/ns-r7oj2i6zpksmrkvk",
"Name": "realdesk",
"Type": "DNS_PRIVATE"
},
{
"Id": "ns-zkd55dxdomyjwwqq",
"Arn": "arn:aws:servicediscovery:ap-northeast-2:489848783055:namespace/ns-zkd55dxdomyjwwqq",
"Name": "local",
"Type": "DNS_PRIVATE"
}
]
}
# namespace 영역 삭제
$ aws servicediscovery delete-namespace --id=ns-r7oj2i6zpksmrkvk
$ aws servicediscovery delete-namespace --id=ns-zkd55dxdomyjwwqq
# list hosted-zones
$ aws route53 list-hosted-zones
{
"HostedZones": []
}