Docker, Docker Hub, Docker Image, Docker/Linux Container, Docker Compose(오늘 직접 해보진 못함)
도커 = 리눅스에서 돌아가는 프로그램을 PC에서 동작할 수 있도록 제공하는 것. + 쉽고(Dockerfile), 빠르게(Container)
애플리케이션 실행환경을 코드로 작성할 수 있고 OS를 격리화하여 관리하는 기술
docker container = Linux Container를 docker라는 회사에서 자체적으로 개발해서 배포해놓은 것!
가장 큰 특징은 어플리케이션에 대한 환경을 Docker는 격리성을 중심으로 한 VM의 관점으로 보다는 Container의 관점에서 빠르고, 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공하는데 있습니다.
라고 한다.도커의 정의를 말하려다가 어째 구조를 말한 것 같으니 다시 정리하고 가자.
즉, 도커란 컴퓨터 개발 환경 자체를 사진 찍는다!고 생각할 수도 있다.
이런 문제들 때문에 개발환경 통제가 필요한거고, 그럴 때 쓸 수 있는게 바로 도커이다. 하나의 컴퓨터에서 여러 개의 컴퓨터를 이용하는 것처럼 하기 위한 것!
docker container = Linux Container를 docker라는 회사에서 자체적으로 개발해서 배포해놓은 것!
라고 얘기했었는데, Linux Container가 바로 위 3가지 문제와 기술을 해결하는 방법으로 개발된 것이고, 그걸 docker라는 회사에서 직접 개발한 것으로 생각하면 된다.여기서 내가 오늘 했던 질문 하나.
Conda 가상환경이랑 뭐가 다른 건가요?
- 답변: 콘다는 가상환경만 제공하는데(콘다는 파이썬 프로그램, 라이브러리 등의 버전만 격리시키는 것이다), 도커 컨테이너는 가상환경 뿐 아니라 컴퓨터의 리소스까지 격리가 된다. 범위의 차이로 이해하면 된다.
- 생각해보니 콘다는 파이썬용 소프트웨어였지! 이걸 기억해냈다면 위와 같은 질문은 하지 않았을 것 같다ㅋㅋㅠ
Dockerfile
: 소스 코드, 의존성 패키지 등등 사용했던 설정 파일을 버전 관리가 쉽도록 명시한 것. 설명서로 생각하면 되고, image가 무거울 때도 있고 하니까 이 설명서만 보면 누구나 내가 만든 도커를 쓸 수 있도록 한 거라고 생각하면 된다. Image
: 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행파일을 묶은 형태 (dockerfile을 빌드하면 생성)container
: image를 실행한 것registry
: 이미지가 모여있는 곳 ex) dockerhub, internal registry(in the corp.)프로세스 = 도커 컨테이너
, 프로그램 = 도커 이미지
, 깃헙 레포지토리 = 도커 레지스트리-> 레포지토리
로 생각할 수 있다.docker container commit
명령을 이용하면 된다. 오늘은 아래 실습을 해보았다.
문제를 풀며 모든 과정을 주석으로 달며했기 때문에 그대로 옮겨둔다. (일부 정보를 특정할 수 있는 정보는 변경하였음을 밝힌다.)
- 환경변수를 지정해 Image를 가져와서 실행하고(이미지 -> 컨테이너), 특정 파이썬 파일을 실행해 출력되는 값 확인하기
- 이미지를 가져와 실행 / 웹 서버와 연결해 게임을 실행하고, 게임 화면 내 특정 단어 확인하기.
- 2번에서 실행한 컨테이너 안 특정 디렉토리에 있는 파일을 호스트로 가져오기.
[환경변수를 지정해 Image를 가져와서 실행하고(이미지 -> 컨테이너), 특정 파이썬 파일을 실행해 출력되는 값 확인하기]
def n331_part1_1():
''' part1_1 에 해당하는 이미지를 실행하고
출력되는 값을 입력하세요 '''
return "화이팅"
'''
[과정]
# 참고: 실행할 이미지 Docker Hub에 들어가서 있는지 확인해봄.
# docker image pull
1. '$ docker pull 이미지_이름:태그'
# docker run - 환경 변수 지정
2. $ docker run -e github_username=Username --name contianer_name 이미지_이름:태그 python part1.py
# 참고
- 그냥 실행하면 `docker container run --name contianer_name 이미지_이름:태그 python part1.py`
=> KeyError: 'github_username'
- 궁금증
1. docker 환경변수의 역할과 세팅 방법은?
=> https://stackoverflow.com/questions/39597925/how-do-i-set-environment-variables-during-the-build-in-docker/63640896#63640896
2. 필수로 설정해야할 환경 변수 목록(ex. github_username)을 어떻게 확인할 수 있는가?
=> $ docker exec container_name env
=> 근데 container status가 running이어야 확인 가능하다. (위 container run은 기본적으로 바로 exit)
=> 바로 exited된 container에 대해 docker start/restart를 해도 안되고, docker contauner run할 때 -d 옵션을 줘도 안됨.
이건 더 알아봐야할 듯. 내가 뭔가 잘못 하고 있는건가? => 질문 예정.
# references
- https://docs.docker.com/engine/reference/commandline/run/ => Search '-env'
- https://stackoverflow.com/questions/34051747/get-environment-variable-from-docker-container
'''
[이미지를 가져와 실행 / 웹 서버와 연결해 게임을 실행하고, 게임 화면 내 특정 단어 확인하기.]
def n331_part1_2():
''' part1_2 에 해당하는 이미지를 실행하고
게임상 오른쪽 3번째 탭에서 시도 횟수를 표현하는 단어를 입력하세요 '''
return "Lives"
'''
[과정]
# git clone
1. $ git clone https://github.com/주소
# container run
2. $ docker container run --name Username --rm -p 818:80 httpd
=> container running
NOTE!!!!
$ docker container run --name Username --rm -p 818:80 이미지_이름:태그
으로 해야 함!! 1-3번 문제 풀다가 발견했음. 위에 적어둔 부분은 참고를 위해 그대로 둠.
# change directory
3. $ cd SpaceInvaders
# Check server
4. localhost:818 in WebBrowser
=> checked 'It works!'
# docker copy
5. $ docker container cp ./ container_name:/usr/local/apache2/htdocs/
(cf. executed in new terminal - 주의: directory 설정 해당 폴더로 한 상태에서 해야 하는 듯?)
# Final - Check 'localhost:818' in WebBrowser
'''
[2번에서 실행한 컨테이너 안 특정 디렉토리에 있는 파일을 호스트로 가져오기.]
def n331_part1_3():
''' 실행한 웹 서버의 /usr/local/apache2 위치에 있는 qeen_track 을 가져오세요
컨테이너 안에 있는 qeen_track 을 호스트로 가져온 뒤 src 폴더 안에 위치하면 테스트가 통과됩니다. '''
# Hint : docker container cp
# **해당 리턴문은 변경하지 마세요 **
return "src/queen_track"
'''
[과정]
# 이 문제는 docker cp에서 어디서 어디로 가져올지 경로 설정하는 것을 상기시키기 위한 문제로 추정된다. (세션 영상에서도 여러 번 강조되었음)
# 가져올 디렉토리로 경로 변경하기 (기존엔 SpaceInvader로 되어있었음)
$ cd ..
$ cd ds-sa-docker
$ cd src
# docker 실행
$ docker container cp container_name:/usr/local/apache2/queen_track ./
=> 'queen_track' 없다고 안되네? 'No such container:path: container_name:/usr/local/apache2/queen_track'
(docker cp 해봐도 똑같이 안됨)
# 'container_name:/usr/local/apache2' 안에 뭐뭐 있는지 확인해보기
$ docker container inspect container_name => 원하는 대로 안 나옴. 근데 이걸로 env 리스트도 보이네? 필수 입력 env는 구분할 수 없긴 하지만.
$ docker exec -t -i container_name /bin/bash 로 root@containerid:/usr/local/apache2# 로 들어가서 ls -a 해봐도 안됨. 뭐지?
$ docker exec container_name ls /usr/local/apache2/ 로 보니까 queen_track 없는데?
#### 1-2에서 image를 httpd로 했었는데 그것 때문인 것 같다. ####
그러네.
$ docker container run --name container_name --rm -p 818:80 이미지_이름:태그 이미지 설정 제대로 했어야했다.
- 이렇게 했을 때도 파일 목록 잘 확인 됨. $ docker exec container_name ls /usr/local/apache2/
- src 폴더로 디렉토리 변경해주고, 이거 하면 됨. $ docker container cp container_name:/usr/local/apache2/queen_track ./
재밌었다!!
'''
여하간 까먹진 않을 듯!
101동 101호
주소만 주고는 그게 어딘지 찾아갈 수 없으니까!