Skip to content

Instantly share code, notes, and snippets.

@nacyot
Last active November 25, 2019 23:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nacyot/c89b967e80fc8a6520d7f39948da6aec to your computer and use it in GitHub Desktop.
Save nacyot/c89b967e80fc8a6520d7f39948da6aec to your computer and use it in GitHub Desktop.
Shell Commands & Docker Image tutorial
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y git
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
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 이미지 실습 가이드

셸 명령어 기초

  • 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

컨테이너에 Git을 설치하고 이미지로 만들기

목표: 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로 이미지 만들기

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 이름을 붙여 만들어보세요.

Sinatra 애플리케이션 실행하기

$ 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 

Ruby on Rails 서버 실행하기 / 환경변수 이해하기

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 명령어 이해하기

$ 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

.dockerignore

.git

Docker hub 사용해보기

  1. https://hub.docker.com/ 에서 계정을 생성합니다.
  2. 로그인을 하고, 첫 화면의 오른쪽 위에서 Create Repository +를 선택합니다.
  3. 이미지 이름과 설명을 입력합니다. 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 공식 도커파일을 직접 빌드하고 자신의 저장소에 올려보세요.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment