2024년 6월 8일 토요일

Docker

Docker

Docker 기억하기

한동안 앱 개발만 하니 docker 사용한지 시간이 좀 지났는데 잊어버리기 전에 다시 한번 정리해본다.

Question:httpd 이름의 새로운 컨테이너를 실행
▶docker run httpd

Question:docker run 과 docker start 차이는?
▶run:이미지를 사용하여 컨테이너를 생성하고 컨테이너를 실행,attached 모드(포어그라운드)가 디폴트로 실행
▶start:이전에 중지된 컨테이너를 시작,detached 모드(백그라운드)가 디폴트로 실행

Question:docker start 로 컨테이너를 가동시킬때 attach 모드로 실행하려면?
▶docker start -a 를 붙인다.

Question:이미 실행중인 컨테이너에 attach 하려면(두가지) ?
▶1.docker container attach 컨테이너이름
▶2.docker log {{컨테이너명}}

Question:docker허브에서 원하는 이미지(mysql, nginx등) 찾으려면?
▶docker search 이미지이름

Question:docker허브에서 이미지를 받으려면?
▶docker pull 이미지이름:버젼(또는 latest)

Question:실행중인 컨테이너를 보여줄때와 실행중이 아닌 컨테이너까지 보여주는 옵션은?
▶docker ps , (중지 된 컨테이너도 보여줌) docker ps -a

Question:docker를 attach 모드로 실행시에 사용자입력을 받게 하고, 터미널연결을 하려면 어떤 옵션을?
▶docker run -i -t

Question:mycon라는 이름의 http 아파치 컨테이너 실행과 종료
▶docker run —name mycon httpd, docker stop mycon(또는 httpd)

Question:mycon라는 컨테이너 삭제와 이미지 삭제
▶docker rm mycon , docker rmi httpd

Question:컨테이너의 내부포트를 외부에서 이용가능하도록 외부(호스트)연결용 포트로 지정는 옵션은?
▶docker run -p 외부접속7777:내부접속80 httpd

Question:외부(호스트)와 바인딩 실행중인 컨테이너의 내부포트를 알고싶은때
▶docker port 컨테이너이름

Question:컨테이너의 내부 파일시스템과 외부(호스트)의 폴더를 연결하여 데이터 또는 웹사이트소스등의 파일을 컨테이너에 들어가지 않고도 수정하고 싶을때는?
▶docker run -p 7777:80 -v (내컴퓨터폴더)~/Mycom/htdocs:(컨테이너내부폴더)/usr/local/httpd/htdocs httpd

Question:회사내부개발용 docker이미지가 필요하다. 무엇을 준비해서 어떻게 해야할까?
▶1.아무폴더에서 Dockerfile 이라는 빈 파일을 만든다.
▶2.Docker 이미지가 될수있도록 파일형식에 맞게 내용을 작성한다.
▶# 베이스 이미지 선택
▶FROM alpine:latest

▶# 작업 디렉토리 설정 (선택사항)
▶WORKDIR /app

▶# 명령어 실행
▶CMD [“echo”, “hello”]
▶3.t(태그)를지정하여빌드한다. docker build -t my-simple-image .
▶34.실행한다. docker run my-simple-image

Question:컨테이너에 파일을 집어넣거나 반대로 파일을 가져올때는?
▶집어넣을떄:docker cp <파일경로> <컨테이너:컨테이너 내부의 경로>
▶뺴올때:docker cp <컨테이너:컨테이너 내부의 경로> <파일경로>

Question:컨테이너가 종료되어도 아이피주소르 똑같이 하기위해서는?
▶docker network create mytest로 생성하고 docker network connect mytest 컨테이너이름 으로연결한다음 프로그램에서 내부컨테이너끼리 통신하기위해서는 mytest://mytest네트워크에연결한컨테이너이름:포트 처럼 mytest에 연결된 컨테이너의 이름을 서로 써주면된다.

Question:Dockerfile 작성 방법?
▶도커파일을 만들 때 레이어 시스템이라는 시스템을 사용하는데 아래 작성한 내용을 명령어 당 한줄 씩 한 레이어라고 칭한다.
▶FROM: 베이스 이미지를 지정합니다.
▶예:FROM ubuntu:20.04
▶-LABEL: 이미지에 메타데이터를 추가합니다.
▶예:LABEL maintainer="your_email@example.com"
▶-RUN: 컨테이너에서 명령을 실행합니다.baseImage안에서 사용할 명령어를 Run으로 작성,RUN {해당 컨테이너에 맞는 명령어} && {&&사용하면 두개이상 가능}
▶예:RUN apt-get update && apt-get install -y curl
▶-COPY: 파일을 호스트에서 이미지로 복사합니다.
▶예:COPY . /app
▶-ADD: 파일 또는 디렉토리를 추가합니다. (압축 파일도 해제 가능) 호스트안에 있는 파일/디렉토리 추가, COPY와 다른점음 압축파일은 해제하고 추가하고, 또한 wget이라는 명령어를 이용하여 추가도 가능
▶예:ADD my_app.tar.gz /app
▶-WORKDIR: 작업 디렉토리를 설정합니다.
▶예:WORKDIR /app
▶-CMD: 컨테이너가 시작될 때 실행할 명령을 지정합니다.
▶예:CMD [“python”, “app.py”]
▶-ENTRYPOINT: 컨테이너가 시작될 때 실행할 명령을 지정하며, CMD와 함께 사용할 수 있습니다.
▶예:ENTRYPOINT [“python”]
▶예:CMD [“app.py”]
▶-ENV: 환경 변수를 설정합니다.${APP_MY_ENV} 처럼사용
▶예:ENV APP_MY_ENV=production
▶-EXPOSE: 컨테이너가 수신할 포트를 지정합니다.
▶예:EXPOSE 80
▶-VOLUME: 컨테이너에 마운트할 볼륨을 지정합니다.
▶예:VOLUME ["/data"]
▶-USER: 컨테이너 내에서 명령을 실행할 사용자를 지정합니다.
▶예:USER appuser
▶-ARG: Dockerfile 빌드 시 전달할 인수를 지정합니다.
▶예:ARG VERSION=1.0.0

Question:Dockerfile 빌드하기?
▶docker build -t 이미지이름:태그 .
▶예:docker build -t myapp:latest .

Question:docker Compose의 파일이름은?
▶docker-compose.yml(yaml)

Question:docker Compose에 기입하는 기본 구성은?
▶version, services, 각 서비스별 설정, image, environment, ports, networks, volumes 가 있다.

Question:docker Compose에 env_file, depends_on, environment 항목에 대한 설명은?
▶-environment: 환경변수를 설정할 수 있다. 단, docker-compose.yml 안에서 정의된 환경변수는 컨테이너 쉘 내부에서 정의된 환경변수들 보다 낮은 우선순위를 가진다.
▶-env_file: "environment"와 동일하게 환경변수를 설정할 수 있다. 하지만 차이점은 env 파일을 이용해 환경변수를 설정할 수 있어서 docker-compose.yml에 앱시크릿을 넣지 않고 env파일로 관리할 수 있어서 소스 컨트롤에 앱시크릿이 올라가게 되는 불상사를 방지할 수 있다.
▶-depends_on: 컨테이너 간의 종속 관계를 설정 할 수 있다. 예를 들어 DB 컨테이너와 App 컨테이너가 있을때 App 컨테이너가 DB 컨테이너와 연결되어 정보를 가져온다고 하면, App 컨테이너는 DB 컨테이너에 종속성을 가지게 되므로 컨테이너가 실행이 될때 App 컨테이너보다 DB컨테이너가 우선 실행되어야 할 필요가 있다. 이런 상황을 위해 "depends_on"을 이용하면, 컨테이너 간의 종속성을 정의하고 실행 순서를 설정할 수 있다.
▶출처: https://blog.betaman.kr/102

Question:docker Compose에 기입하는 각 구성에 대해 설명?

▶#도커 컴포즈의 버전을 설정
▶version: "3"
▶#컨테이너들의 설정 내용
▶services:
▶  #이름:컨테이너1
▶  컨테이너1:
▶    #베이스이미지 설정
▶    image: mysql:5.7
▶    #네트워크 설정
▶    networks:
▶      - 내맘대로 네트워크 이름1
▶    volumes:
▶      - 내맘대로 볼륨 이름1
▶    #환경변수 설정
▶    environment:
▶      MYSQL_ROOT_PASSWORD: root_pwd
▶      MYSQL_DATABASE: db
▶      MYSQL_USER: user
▶      MYSQL_PASSWORD: pwd
▶    #포트 설정
▶    ports:
▶      - 포트설정
▶  #이름:컨테이너2
▶  컨테이너2:
▶    image: wordpress
▶    networks:
▶      - 내맘대로 네트워크이름1
▶    volumes:
▶      - 내맘대로 볼륨 이름2
▶    ports:
▶      - 8000:80
▶#네트워크 설정
▶networks:
▶  내맘대로 네트워크 이름1:
▶#볼륨 설정
▶volumes:
▶  내맘대로 볼륨 이름1:
▶  내맘대로 볼륨 이름2:

Question:docker Multi Stage란, 사용하는 이유?
▶nodejs 나 중간컴파일이 필요한 이미지의 경우 최종이미지의 사이즈를 줄여서 배포를 용이하게 하기위해 사용
▶예를들어 npm build 를 해서 나온 결과물(html,css등)을 nginx에서 홈페이지의 소스디렉토리로 활용하고자 할경우에 사용한다. npm build 에는 많은 쓸데없는 결과물(라이브러리)도 생성되기 때문에 이를 하나의 스테이지로 작성하면 작성되는 image 가 너무 커지기 때문이다.
▶아래의 예제처럼 두개의 FROM(스테이지구분) 으로 빌드결과물인 mynpmbuilder 을 nginx 에 지정하여 최종image는 nginx만 가동하도록 할수있다.(FROM 을 몇개를 중복하더라도 최종스테이지만 image 에 반영된다.)

▶FROM node:16-alpline as mynpmbuilder
▶
▶WORKDIR /app
▶COPY ./my-app ./
▶
▶RUN npm install && npm run build
▶
▶FROM nginx:1.21.0-apline as production
▶COPY --from mynpmbuilder /app/build /usr/share/nginx/html
▶COPY nginx.conf /etc/nginx/conf.d/default.conf
▶
▶EXPOSE 80

0 comments:

댓글 쓰기