- pwd: 현재 디렉터리 확인
$ pwd
- ls: 파일 목록 출력
$ ls
$ ls -a
$ ls -l
- cd: 디렉터리 이동
$ cd <TO>
- cp: 파일 복사
$ cp <FROM> <TO>
$ cp -r <FROM> <TO>
- mv: 파일 이동
$ mv <FROM> <TO>
- echo: 출력
$ echo "Hello, world"
- export/unset: 환경변수 설정/제거
$ export B=abcd
$ unset $B
- touch: 파일 생성
$ touch a b c d
- cat: 파일 내용 출력
$ cat <PATH>
- head: 파일의 첫부분 출력
$ head <PATH>
$ head -n 30 <PATH>
- tail: 파일의 끝부분 출력
$ tail <PATH>
$ tail -n 30 <PATH>
$ tail -f <PATH>
- less: 페이저
$ less <PATH>
- bash: 셸
$ bash
$ bash -c <COMMAND>
- clear: 화면 초기화
$ clear
- ifconfig: 네트웍 관련 정보 출력
$ ifconfig
- vi: 에디터
$ vi <PATH>
- man: 매뉴얼
$ man <COMMAND>
- which: 명령어 위치 찾기
$ which <COMMAND>
- find: 파일/디렉터리 탐색
$ find <TARGET_PATH> <OPTIONS>
$ find / --name Dockerfile
목표: Docker의 레이어 개념 이해하기
# 새로운 도커 컨테이너를 실행
$ docker run -it --name git ubuntu:latest /bin/bash
# 파일을 만들어본다
container$ touch mario luigi cooper
container$ ls
# (다른 셸에서) docker diff로 변경 사항 확인
$ docker ps
$ docker diff <DOCKER_CONTAINER_ID>
# (컨테이너 안에서) 추가했던 파일을 삭제
$ rm mario luigi cooper
# (다른 셸에서) 다시 docker diff로 변경 사항 확인
$ docker diff <DOCKER_CONTAINER_ID>
# (컨테이너 안에서) git이 있는지 확인하고 설치하기(
$ git -v
$ apt-get update
$ apt-get install -y git
$ git -v
# (다른 셸에서) ubunutu 이름이 붙여있는 이미지 확인
$ docker images | grep ubuntu
$ docker commit git ubuntu:git
# 새롭게 추가된 이미지 확인
$ docker images | grep ubuntu
- 추가 과제: 컨테이너에 wget을 설치하고 이미지로 만들어보세요.
- 추가 과제: docker의 우분투 이미지에는 ip, telnet, tree와 같은 리눅스 기본적인 명령어가 포함되어 있지 않습니다. 이러한 명령어를 사용하기 위해 설치해야 하는 패키지를 검색해보고 설치해보세요.
- 추가 과제: 새로 생성한 이미지와 기존 이미지에
docker history
명령어를 사용해보고, 어떤 의미인지 파악해보세요.
Dockerfile
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y git
# 도커 이미지 빌드하기
$ docker build -t ubuntu:git-dockerfile .
$ docker images | grep ubuntu
- 추가 과제: wget, ip, telnet, tree가 설치된 이미지를 ubuntu:tools 이름을 붙여 만들어보세요.
$ git clone https://github.com/nacyot/docker_tutorial sinatra_dockerfile
$ cd sinatra_dockerfile
Dockerfile
FROM ruby:2.3-slim
COPY Gemfile* /usr/src/app/
WORKDIR /usr/src/app
RUN bundle install
COPY . /usr/src/app
EXPOSE 4567
CMD bundle exec ruby app.rb -o 0.0.0.0
$ docker build -t webserver:sinatra .
$ docker run -p 4567:4567 -it webserver:sinatra
- 추가 과제: python 이미지를 베이스 이미지로 flask 애플리케이션을 샐행하는 Dockerfile을 작성해보세요. 참고: http://flask.pocoo.org/docs/1.0/quickstart/#a-minimal-application
FROM ruby:2.3
RUN apt-get update
RUN apt-get install -qq -y libsqlite3-dev nodejs
RUN gem install rb-inotify -v '0.9.10'
RUN gem install foreman compass
WORKDIR /app
RUN git clone https://github.com/nacyot/docker-sample-project.git /app
RUN git checkout v0.4
RUN gem install bundler -v '< 2'
RUN bundle update json
RUN bundle install --without development test
RUN bundle exec rake db:create
RUN bundle exec rake db:migrate
ENV SECRET_KEY_BASE hellodocker
ENV RAILS_ENV production
EXPOSE 3000
CMD foreman start -f Procfile
$ docker run -p3000:60005 -e RAILS_ENV=development -it nacyot/sample_server:latest bash
$ docker run -p3000:60005 -e RAILS_ENV=development -it nacyot/sample_server:latest
- 추가 과제: bash를 실행해서 이미지에서 환경변수가 어떻게 적용되어있는지 확인해보세요. 다른 환경변수를 변경해보세요.
- 추가 과제: 위에서 실행하는 애플리케이션(저장소)을 직접 ruby:2.3 이미지의 Bash 셸에서 프로비저닝 해보세요.
- 추가 과제: RUN 명령어는 매번 레이어를 생성합니다. 레이어 수가 늘어나지 않도록 위의 내용에서 RUN 명령어들을 하나의 RUN 명령어로 작성해보세요.
- 추가 과제: 위의 도커파일에서는 프로젝트를 빌드 중에 클론합니다. 프로젝트를 먼저 클론하고 이 프로젝트의 루트에 같은 애플리케이션을 실행하는 Dockerfile를 작성해보세요.
$ docker build -t nacyot/my_ubuntu:git .
$ docker build -t nacyot/my_ubuntu:git -f <DOCKERFILE_PATH> .
$ docker build -t nacyot/my_ubuntu:git <ANOTHER_DIR>
- 추가 과제: 루트 디렉터리로 이동후 앞서 작성한 nacyot/sample_server의 도커 파일을 빌드해보세요. (힌트: 빌드 컨텍스트, 도커파일 경로 지정)
.dockerignore
.git
- https://hub.docker.com/ 에서 계정을 생성합니다.
- 로그인을 하고, 첫 화면의 오른쪽 위에서 Create Repository +를 선택합니다.
- 이미지 이름과 설명을 입력합니다. my_ubuntu 이미지를 생성합니다.
$ docker tag ubuntu:git <USER_ID>/my_ubuntu:git
$ docker push <USER_ID>/my_ubuntu:git
$ docker rmi ubuntu:git
$ docker rmi my_ubuntu:git
$ docker pull my_ubuntu:git
$ docker run -it my_ubuntu:git bash
# (컨테이너 안에서)
$ git -v
- 추가 과제: 앞서 작성한 my_ubuntu:tools 이미지를 같은 저장소에 올려보세요. 이미지를 삭제하고 다운로드 받아보세요.
- 추가 과제: nginx 공식 도커파일을 직접 빌드하고 자신의 저장소에 올려보세요.