docker --version
현재 설치된 Docker 클라이언트의 버전을 확인함.
wsl -l -v
현재 시스템에 설치된 WSL(Windows Subsystem for Linux) 배포판의 목록을 버전 정보와 함께 나열함.
wsl -d docker-desktop busybox
docker-desktop이라는 WSL 배포판에서 busybox 라는 명령어를 실행함.
뭔지는 잘 모르겠는데 일단 docker-desktop이라는 Docker가 사용하는 리눅스 WSL 환경에 접근할 수 있는 친구인것 같음.
대충 아래 명령어들이 있는것 같음.
이거는 busybox를 통해서 docker-desktop의 리눅스 환경에 명령어를 실행한거임.
wsl -d docker-desktop busybox ls
wsl -d docker-desktop busybox echo "Hello from BusyBox!"
이거는 직접 docker-desktop의 리눅스 환경 셸로 진입하는 명령어임.
wsl -d docker-desktop busybox ash
한 마디로는 가상의 컴퓨터를 뜻함.
이미지 N개가 모여서 하나의 컨테이너가 될 수 있음.

이전에는 virtual machine 이라는게 있었음.
이거는 각 가상환경에 os, 코드 이런거 다 넣어서 하나의 .zip 파일로 만든거를 가상환경에 풀어준거임.
이러니까 가상 머신에 배포도 오래 걸리고 불편했었음.
그런데 Docker의 컨테이너라는 친구는 가상 환경에 그냥 내가 작성한 코드만 있으면 돌아가는거임.
Docker Engine이라는 곳에서 알아서 알아서 os나 이런거 관리해주는 거임.
client: dbeaber
host: docker-desktop
hub: docker hub
docker search ubuntu
docker hub에 올라와있는 ubuntu 이미지 검색하는 명령어.
docker pull ubuntu:latest
대충 이미지 하나 골라 잡아서 설치하는 명령어.
docker images
잘 설치되었는지 확인하는 명령어.

docker desktop에서도 확인이 가능하긴 함.
docker run -i -t --name ubuntu-container ubuntu /bin/bash
이미지로 컨테이너를 생성하고, /bin/bash로 실행하는 명령어임.

이렇게 되면 컨테이너를 생성하고 접속까지 한 상태가 되는거임.
docker desktop에서도 생성한 컨테이너를 확인, 접속 할 수 있음.

docker start -i ubuntu-container
이미 생성되어있는 컨테이너에 접속하는 명령어임.
docker ps
현재 실행 중인 컨테이너 목록을 보여줌.

이렇게 한 터미널은 접속시켜 놓고 다른 터미널에서 입력해줘야 보임.
docker stop ubuntu-container
실행중인 컨테이너를 종료 시킬 수 있음.

docker start ubuntu-container
종료된 컨테이너를 실행 시킬 수 있음.
docker restart ubuntu-container
컨테이너 껏다 키는 명령어임. stop과 start를 해주는거임.
docker attach ubuntu-container
해당 컨테이너에 접속하는 명령어임. 대충 docker start -i ubuntu-container랑 비슷한 듯?
docker exec -it <컨테이너> /bin/bashdocker exec ubuntu-container echo "Hello from container"
쉘에 접속하지 않고 리눅스 명령어를 실행하는 명령어.
docker ps -a
docker stop ubuntu-container
docker rm ubuntu-container
docker ps -a
컨테이너를 삭제하는 명령어.
docker images
docker rmi ubuntu:latest
docker images
이미지를 삭제하는 명령어.
# server image는 ubunutu 18.04를 사용
FROM ubuntu:18.04
# image가 올라갔을 때 수행되는 명령어들
# -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
RUN \
apt-get update && \
# 접근 권한에 yes를 적용함.
apt-get install -y apache2
# 파일 복사
# 내가 작성한 코드를 이미지의 특정 경로에 배포하기 위한 명령어임
COPY hello.html /var/www/html
# 작업공간 이동 (=cd)
# 초기 경로를 지정해줌. 내가 작성한 코드가 있는 경로로 설정하는 것이 좋음.
WORKDIR /var/www/html
# 로그 확인
RUN ls
# apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 함.
# 부모 PC에서 접속할 수 있도록 80포트를 열어 놓음.
EXPOSE 80
# 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
# apachectl을 foreground(즉 백그라운드, deamon)상태로 돌아가도록 한다.
# 나중에 일일히 켜고 끄는거 귀찮아서 미리 자동으로 실행되도록 설정해준거임.
CMD ["apachectl", "-D", "FOREGROUND"]
Dockerfile은 이미지로 컨테이너를 만들기 위한 파일임.
Dockerfile 작성할 때 레이어를 적게 사용하는 것이 좋음.
레이어란 Dockerfile에 작성된 명령어 한줄한줄을 뜻함.(FROM, RUN, COPY, WORKDIR)
레이어가 많아지면 무거워져서? 이미지를 생성하는데 시간이 더 오래 걸림.
RUN apt-get update && apt-get install -y apache2
이렇게 적어도 되는데 레이어를 적게 만들기 위해서 아래처럼 적은거임.
# &&: 여러 명령ㅇ어를 한줄로 실행
# \: 줄바꿈
RUN \
apt-get update && \
apt-get install -y apache2
docker build -t apache-image .
현재 경로에 있는 Dockerfile을 기반으로 apache-image라는 이름의 도커 이미지를 빌드하는 명령어임.
[1/5] 처럼 우리가 작성한 전체 레이어와 현재 실행중인 레이어를 확인할 수 있음.
docker images
docker run -d -p 80:80 --name apache-container apache-image
docker ps -a
apache-image로부터 컨테이너를 만들고, 이름은 apache-container로 지정하고,
포트 80을 열어서 백그라운드에서 실행하라는 명령임.
이때 80:80은 부모 포트:자식 포트 임.
주소창에 http://localhost 입력하면 컨테이너의 기본 페이지로 이동할 수 있음.
주소창에 http://localhost/hello.html 입력하면 아까 넣은 hello.html을 볼 수 있음.
자식PC에 부모PC의 특정 디렉토리를 마운트 할 수 있음.
이렇게 하면 자식PC의 html 디렉토리는 부모PC의 common 디렉토리의 내용을 가지게 됨.
docker run -d --name apache-container -p 80:80 -v C:\dev\docker\common\:/var/www/html ubuntu/apache2
명령어가 좀 길어서 이렇게 쓸수 있음.
docker run -d --name apache-container `
>> -p 80:80 `
>> -v C:\dev\docker\common\:/var/www/html `
>> ubuntu/apache2
이렇게 마운트 하면 좋은 점이, 그냥 부모 PC에서 소스 코드 수정하면 자식 PC에 바로바로 적용되어서 실시간 배포가 가능해짐.
version: "3"
services:
#Dockerfile
apache2:
# FROM
image: ubuntu/apache2:latest
container_name: apache-container
volumes:
- ./common:/var/www/html
ports:
- "80:80"
# docker-compose up -d
이렇게 생긴 파일로도 컨테이너를 생성할 수 있음.
Dockerfile로 이미지를 만들면 마운트하는 명령어를 따로 입력해줘야 하지만,
docker-compose.yaml로 이미지를 만들면 파일 내에서 마운트 하도록 설정할 수 있음.
docker-compose up -d
이 명령어로 container를 생성할 수 있음.