이 글은 LG CNS AM Camp 1기에서 수강한 내용을 정리한 글입니다.

🔗 실습 코드
| 디렉토리 | 실습 설명 |
|---|---|
| go | Dockerfile을 이용한 도커 이미지 빌드 |
| ROOT | 도커 허브에서 이미지 가져오기 & 컨테이너-호스트 간 파일 복사 |
| webserver | Dockerfile 작성 시 유의사항 (우분투 컨테이너에 아파치 웹 서버 설치 - 사용자 입력과 백그라운드 프로세스 이슈) |
| layer | Dockerfile 작성 시 유의사항 (이미지 크기 이슈) |
| buildpattern | 빌더 패턴 |
| multistagebuild | 다단계 빌드 |
| cmd_entrypoint | CMD 지시어와 ENTRYPOINT 지시어의 차이 |
| env | ENV 지시어 |
| gugudan | 구구단 출력 프로그램을 실행하는 이미지 생성 실습 |
| docker_compose | Docker compose 실습 |
C:\Windows\System32> docker versionC:\Users\user> docker help
C:\Users\user> docker container --help
C:\Users\user> docker container ls --helpDockerfile
도커 이미지 생성 과정
c:\docker\go> docker buildx build [<옵션>] <Dockerfile 경로>-t example/echo:latest: 이미지 이름을 지정 (<저장소명>/<이미지명>:<태그>)c:\docker\go> docker container run [<옵션>] <이미지명> [<명령>] [<인자>]-d: 컨테이너를 detach 모드로 실행-p 8282:8080: 포트 바인딩 (<호스트 포트번호>:<컨테이너 내부 포트번호> - 호스트 포트 미지정 시 가용 포트번호 자동지정)--name <컨테이너명>: 컨테이너 이름을 지정--rm: 컨테이너 안의 프로세스가 종료되면 컨테이너 자동 삭제도커 허브에 이미지를 등록하기/가져오기
c:\docker\go> docker image tag example/echo:latest <도커 허브 계정명>/echo:latestc:\docker\go> docker image push <도커 허브 계정명>/echo:latestc:\docker\go> docker container run [<옵션>] <도커 허브 계정명>/echo:latesdocker image pull → docker container create → docker container start 순서로 실행도커 컨테이너 삭제하기
docker container rm [<옵션>] <컨테이너 식별자>-f: 강제 삭제docker container rm -f $(docker container ls -aq)다양한 도커 컨테이너 명령 및 옵션
docker image lsdocker container ls-a: 모든 상태의 컨테이너 조회-q: 컨테이너ID만 출력curl http://localhost:<연결된 호스트 포트번호>docker container logs <컨테이너 식별자>docker container attach <컨테이너 식별자>docker container exec [<옵션>] <컨테이너 식별자> <명령> [<인자>]-i: 표준입력 활성화-t: TTY 모드(pseudo-TTY) 사용docker container cp <컨테이너명>:<경로> <호스트 경로>docker container cp <호스트의 파일> <컨테이너명>:<경로>컨테이너 내부에 /bin/bash가 실행된 결과
<현재 로그인한 사용자 계정>@<호스트명>:/<디렉터리>$
- 호스트명: 컨테이너ID와 동일
- 디렉터리: WORKDIR에 설정된 디렉터리
- $ 또는 #: 일반 사용자 또는 루트 사용자
set | grep HOSTNAME: 컨테이너 실행 시 HOSTNAME을 컨테이너ID로 설정
exit: 내부 쉘에서 나오기
Dockerfile 작성 시 유의사항
빌더 패턴

다단계 빌드 Dockerfile (multi-state build) (교재 151p 참고)
RUN, CMD, ENTRYPOINT 지시어에서 명령어를 기술하는 방법
CMD ["go", "run", "/goapp/main.go"]CMD go run /goapp/main.goCOPY vs ADD
CMD vs ENTRYPOINT
--entrypoint 옵션을 이용해서 컨테이너를 실행 시: Dockerfile의 ENTRYPOINT 설정을 무시하고 강제로 다른 값을 설정ENV
--e 옵션을 이용해서 컨테이너를 실행 시: 실행 시점에서 옵션을 통해 전달된 새로운 값으로 환경변수가 설정됨
docker volume create <볼륨명>docker run -v <볼륨명>:<컨테이너의 디렉터리> <이미지명>docker run -v <호스트의 디렉터리>:<컨테이너의 디렉터리> <이미지명>종류
명령
docker network create --driver=<네트워크 종류> <네트워크명>docker network connect <네트워크명> <컨테이너명>docker container run --net=<네트워크명> <이미지명>
docker compose up [<옵션>]--scale <서비스명>=N: N개의 <서비스명> 컨테이너를 동시에 실행docker compose down [<옵션>]