• Windows 10과 맥에서 docker를 설치하고 WSL과 통합하여 기본적인 컨테이너를 올려보는 기회.

Windows10 + WSL2 + Ubuntu

  • 현 시점에서 WSL2+Ubuntu는 기본 사양이므로 넘어가도록 하겠다.
  • 필요하면 이 링크 참고.
  • 바쁜 사람들을 위한 짧은 코드 (powershell에서 실행해야된다)
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • WSL 설치 후 MS스토어에서 Ubuntu를 받으면 된다. 대부분 Ubuntu를 많이 쓴다.
  • 추후 wsl을 사용하기 위해 Windows Terminal도 설치하면 좋다. 여기서는 생략.

Docker 설치

Windows 10 에서 WSL과 통합

  • 막상 WSL2에서 docker명령어를 쳐보면 다음과 같은 화면이 나온다.
  • 도커 문서를 따라 WSL2 백엔드로 바꿔주면 된다.

최초의 컨테이너

  • docker hub 사이트에서 httpd라고 검색해보자
  • 오른쪽의 명령어를 복사해 터미널에서 실행하면 최초로 image를 다운받는다.
docker pull httpd
  • 이 image에는 미리 작성된 어플리케이션과 설정이 담겨있다.
  • image는 컨테이너를 끄거나 재시작 하더라도 따로 삭제 하기 전에 계속 남아있다.
  • 다음 명령어를 실행해 컨테이너를 실행한다.
docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4
  • 아래와 같은 해시값 같은것 외에 아무 정보가 없다.
  • 당황하지 않고 다시 아래 명령어를 치면 현재 실행중인 컨테이너가 어떤것인지 보여준다.
docker ps
  • 보이는 바와 같이 my-apache-app라는 이름의 httpd:2.4 image를 사용한 컨테이너가 띄워져있는 것을 알 수 있다.
  • ports에 0.0.0.0:8080->80/tcp 라고 바인딩 되있는것은 호스트(aka. 내 컴퓨터, 맥, 노트북)의 8080포트와 http:2.4 컨테이너의 TCP 80포트를 연결했다는 의미다. (-p 8080:80 옵션)
  • 잠깐 run 명령어로 돌아가서 -dit 옵션은 d는 데몬으로 실행함을 의미하며 i는 인터렉티브 모드로 실행함을 t는 tty를 실행할 것임을 의미힌다. 데몬으로 실행하게 되면 실행시 컨테이너의 쉘로 떨어지지 않는다.
  • 볼만큼 봤으니 웹브라우저에서 http://localhost:8080을 들어가면 계정의 홈디렉토리가 등장한다.

디렉토리 연결

  • -v 옵션을 주면 HOST에 있는 경로를 컨테이너 내의 디렉토리와 연결할 수 있다. "$PWD":/usr...인데 $PWD는HOST 내의 홈디렉토리를 뜻하고 : 뒤의 경로는 컨테이너 내의 아파치 DocumentRoot 기본 경로다.
  • DocumentRoot란 웹서버가 요청을 받았을때 리소스를 참조하는 기본 경로를 뜻한다.
  • HOST의 홈 디렉토리를 아파치의 DocumentRoot로 연결했으니 아파치가 기본설정이라면 Directory 리스트를 출력한다. 위 결과와 같이 나온다는것을 알 수 있다.

직접 접근하기

  • 컨테이너에 직접 쉘로 접근해보자
  • docker ps 명령어로 나오는 container id를 잘 복사해놓고 다음 명령어를 해보자
docker exec -it (복사한CONTAINER ID) /bin/bash
  • exec 명령은 컨테이너 내의 특정 명령어를 실행한다.
  • it 옵션으로 가상 터미널을 연결해 상호작용을 한다.
  • 컨테이너 내의 /bin/bash 명령어를 실행한다.
  • 명령어를 치면 프롬프트가 바뀌는 것을 볼 수 있다.
  • 바뀐 프롬프트에서 아무 디렉토리나 파일을 만들어보자.

컨테이너 종료와 재시작

  • 이제 밖으로 나와보자
  • 그리고 컨테이너를 종료해보자.
docker stop (복사한CONTAINER ID)
  • docker ps에서 사라지고 localhost:8080에도 더이상 접속되지 않는다.
  • 그러나 컨테이너가 사라진것은 아니다. 다음 명령어를 쳐보자.
docker ps -a
  • 단지 STATUS가 Extied일 뿐 컨테이너가 사라지진 않았다. 이것을 다시 시작해보자
docker start (복사한 CONTAINER ID)
  • 그리고 다시 컨테이너로 쉘에 접근해보자.
  • 같은 컨테이너를 단순히 stop했다 start하는것만으로는 자료가 삭제되지 않는다.
    • 그러나 tmpfs 옵션으로 생성해 바인딩한 볼륨은 초기화된다.

컨테이너의 삭제

  • 호스트로 빠져나와 다음 명령어를 써보자
docker stop (복사한 CONTAINER ID)
docker rm (복사한 CONTAINER ID)
  • 그리고 다시 컨테이너를 생성해보자
docker run -dit --name my-apache-app -p 8080:80 httpd:2.4
  • 컨테이너로 다시 들어가면 삭제된것을 알 수 있다.
  • 즉, 컨테이너를 stop하는것만으로는 안에 자료가 삭제되지 않고, 컨테이너를 지워야 삭제가 된다
  • 이같은 경우를 조심해서 어플리케이션 버전 업데이트 등으로 컨테이너를 교체할때를 대비해 DB나 WAS등 중요한 데이터는 -v 옵션으로 HOST에 바인딩을 꼭 하고 사용해야겠다.

참고한 링크

  • https://docs.docker.com/engine/reference/commandline/start/
  • https://docs.docker.com/storage/
  • https://docs.docker.com/engine/reference/run/#detached--d
  • https://docs.docker.com/config/containers/start-containers-automatically/
  • https://docs.docker.com/storage/tmpfs/
  • https://oboki.net/workspace/system/docker/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90-shell-%ED%99%98%EA%B2%BD%EC%9C%BC%EB%A1%9C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0/
  • https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html#%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%AA%A9%EB%A1%9D-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-ps
  • https://m.blog.naver.com/alice_k106/221052679651

Comments