Tag: docker
All the articles with the tag "docker".
- 버전을 v14으로 낮춰서 빌드를 진행하였고, 성공함
- 자료들을 찾아본 결과 mediatype문제는 거의 최신 버전을 제대로 지원하지 못해 생기는 문제인 것 같다. 버전을 바꿔서 시도해보자.
📚 Reference
gitlab-runner 상에서 docker 빌드가 안되는 문제
gitlab-runner 최신 이미지가 manifest mediatype 을 제대로 지원하지 못해 빌드가 깨졌다. 이미지 버전을 v14 로 낮춰 해결.
- 첫 시도는
docker-compose build --no-cache명령어를 통해 기존의 cache를 모두 날리고.dockerignore에node_modules를 추가한 뒤 다시 빌드를 진행- 하지만 똑같은 문제가 발생하였음
- 두 번째 시도로
node_modules와package-lock.json를 삭제하고 처음 시도했던 방식으로 빌드를 진행- 이 경우 정상적으로 빌드가 진행되었음
- 새로운 npm 환경을 가지고 왔을 때는
node_modules와package-lock.json를 삭제하고 다시 설치해보는 시도를 해봐야겠다. - 다른 곳에서 가지고 온 module 파일과 같은 환경 파일의 권한이 잘못 설정되어 있을 수 있다.
📚 Reference
docker 빌드 시 권한 문제로 install이 안되는 문제
docker-compose build 가 archive/tar: unknown file mode 로 실패. 다른 환경에서 가져온 node_modules 의 권한이 문제라 package-lock.json 과 함께 지우고 다시 설치했다.
| 인스트럭션 | 내용 |
|---|---|
FROM | 토대가 되는 이미지를 지정 |
ADD | 이미지에 파일이나 폴더를 추가 |
COPY | 이미지에 파일이나 폴더를 복사 |
RUN | 이미지를 빌드할 때 실행할 명령어 지정 |
CMD | 컨테이너를 실행할 때 실행할 명령어 지정 |
ENTRYPOINT | 컨테이너를 실행할 때 실행할 명령어 강제 지정 |
ONBUILD | 이 이미지를 기반으로 다른 이미지를 빌드할 때 실행할 명령어를 지정 |
EXPOSE | 이미지가 통신에 사용할 포트를 명시적으로 지정 |
VOLUME | persistency data를 저장할 경로를 명시적으로 지정 |
ENV | 환경변수 정의 |
WORKDIR | RUN, CMD, ENTRYPOINT, ADD, COPY에 정의된 명령어를 실행하는 작업 디렉터리를 지정 |
SHELL | 빌드 시 사용할 shell을 변경 |
LABEL | 이름이나 버전, 저작자 정보를 설정 |
USER | RUN, CMD, ENTRYPOINT에 정의된 명령어를 실행하는 사용자 또는 그룹을 지정 |
ARG | docker build 커맨드를 사용할 때 입력받을 수 있는 인자를 선언 |
STOPSIGNAL | docker build 커맨드를 사용할 때 컨테이너 안에서 실행 중인 프로그램에 전달되는 시그널을 변경 |
HEALTHCHECK | 컨테이너 health check 방법을 커스터마이징 |
컨테이너와 호스트 간에 파일 복사하기
프로그램만으로 구성된 시스템은 그리 많지 않다. 5장에서도 나왔듯이 프로그램 외에도 프로그래밍 언어의 런타임이나 웹 서버, 데이터베이스 등이 함께 시스템을 구성한다.
# 베이스 이미지 선택
FROM kwon0528/postgres_backend:0.5
# 필요한 패키지 설치 (bash 설치)
RUN apt-get update && apt-get install -y bash
# 작업 디렉토리 설정
WORKDIR /home
# back.sh 파일 복사
COPY back.sh /home/back.sh
# 실행 권한 부여
RUN chmod +x /home/back.sh
# 실행
CMD ["bash", "/home/back.sh"]
Dockerfile.vue
# 베이스 이미지 선택
FROM kwon0528/vue_frontend:0.3.2
# 작업 디렉토리 설정
WORKDIR /app
# # front.sh 파일 복사
# COPY front.sh /app/chuibot/front.sh
# # 실행 권한 부여
# RUN chmod +x /app/chuibot/front.sh
# # 실행
# CMD ["sh", "/app/front.sh"]
# CMD cd ~/chuibot && git pull도커 컴포즈를 익히자
시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구이다.
| 항목 | 내용 |
|---|---|
| kube-let | 마스터노드에 있는 kube-scheduler와 연동하며 워커 노드에 파드를 배치하고 실행한다. 또 실행 중인 파드의 상태를 정기적으로 모니터링하며 kube-scheduler에 통지한다 |
| kube-proxy | 네트워크 통신의 라우팅 메커니즘 |
쿠버네티스를 익히자
Kubernetes는 컨테이너 오케스트레이션 도구이다. 컨테이너 오케스트레이션이란 시스템 전체를 통괄하고 여러 개의 컨테이너를 관리하는 일을 말한다.
C:\Users\Kwon>docker run --name mysql000ex11 -dit --net=wp -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress---db -e MYSQL_USER=wordpress000user -e MYSQL_PASSWORD=1234 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
853dd040ade1fef5532d8429504d7a1b2ab3f0b3cb6f8ed635918d4df773b1b6
C:\Users\Kwon>docker run --name wordpress000ex12 -dit --net=wp -p 8085:80 -e WORDPRESSS_DB_HOST=mysql000ex11 -e WORDPRES
S_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000user -e WORDPRESS_DB_PASSWORD=1234 wordpress
aef41f135fbdba00fe389a0f882e52aaa05f24f638fbf7ce3277dfc964ea5e79
C:\Users\Kwon>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aef41f135fbd wordpress "docker-entrypoint.s…" 24 seconds ago Up 21 seconds 0.0.0.0:8085->80/tcp wordpress000ex12여러 개의 컨테이너를 연동해 실행해보자
워드프레스는 웹 사이트를 만들기 위한 소프트웨어로, 아파치나 데이터베이스, PHP 런타임 등을 필요로 하기 때문에 구축을 위한 연습 소재로 좋다.
| 이미지 이름 | 컨테이너의 내용 | 컨테이너 실행에 주로 사용되는 옵션 및 인자 |
|---|---|---|
| openjdk | java 런타임 | -d를 사용하지 않고 인자로 java 명령 등을 지정해 도구 형태로 사용한다. |
| python | python 런타임 | -d를 사용하지 않고 인자로 python 명령 등을 지정해 도구 형태로 사용한다. |
| php | PHP 런타임 | 웹 서버가 포함된 것과 실행 명령만 포함된 것으로 나위어 제공된다. |
| ruby | ruby 런타임 | 웹 서버가 포함된 것과 실행 명령만 포함된 것으로 나위어 제공된다. |
| perl | perl 런타임 | -d를 사용하지 않고 인자로 perl 명령 등을 지정해 도구 형태로 사용한다 |
| gcc | C/C++ 컴파일러 | -d를 사용하지 않고 인자로 gcc 명령 등을 지정해 도구 형태로 사용한다 |
| node | Node.js | -d를 사용하지 않고 인자로 app 명령 등을 지정해 도구 형태로 사용한다 |
| registry | 도커 레지스트리 | -d옵션을 사용해 백그라운드로 실행한다. -p 옵션으로 포트 번호를 지정한다. |
| wordpress | WordPress | -d옵션을 사용해 백그라운드로 실행한다. -p 옵션으로 포트 번호를 지정한다. MySQL 또는 MariaDB가 필요하다. 접속에 필요한 패스워드는 -e 옵션으로 지정한다. |
| nextcloud | NextCloud | -d옵션을 사용해 백그라운드로 실행한다. -p 옵션으로 포트 번호를 지정한다. |
| redmine | Redmine | -d옵션을 사용해 백그라운드로 실행한다. -p 옵션으로 포트 번호를 지정한다. PostgreSQL 또는 MySQL이 필요하다 |
컨테이너를 실행해 보자
컨테이너를 다루는 모든 명령은 docker 명령어로 시작한다 docker 명령어 뒤에 '무엇을', '어떻게', '대상' 순으로 지정하여 명령어를 작성한다.
2-1. OS는 뭘 하는가?
소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다.
하드웨어는 자신의 판단으로 여러 의미 중 적절한 것을 고르거나 적당히 일을 할 수 없고, 지시받은 대로만 수행할 수 있으므로 동작 하나하나를 지정해 주지 않으면 안 된다.
OS는 이런 일들을 하드웨어가 알아들을 수 있게 번역하여 전달하게 된다.
2-2. 도커의 리눅스 OS 비슷한 것
본래 OS는 ‘커널’이라는 부분과 ‘그 이외의 주변 부분’으로 구성된다. 주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.
여기서 도커의 컨테이너는 운영체제의 주변 부분을 가지고 있다. 이를 통해 프로그램의 명령을 전달받고, 이를 밑바탕이 되는 커널에 전달하는 구조로 되어 있다.
이 덕분에 OS 전체를 컨테이너에 넣지 않을 수 있어, 도커는 가장 큰 특징인 ‘가벼움’을 얻을 수 있다.
2-3. 도커는 기본적으로 Linux 용이다.
도커의 동작 원리
위 그림은 도커의 간단한 구조를 나타낸 것이다. 물리 서버가 있고, 여기서 동작하는 리눅스 운영체제가 있다.
2-1. 컨테이너
컴퓨터(서버) 상의 환경을 작게 분할한 공간
이렇게 나누어진 컨테이너에 데이터나 프로그램을 두어 격리한다. 이를 격리하는 기능을 제공하는 소프트웨어가 도커다. 도커는 도커 소프트웨어 본체인 도커 엔진을 설치해 사용한다. 이 도커 엔진을 사용하여 컨테이너를 생성하고 구동할 수 있다.
컨테이너를 만드는 데에는 도커 엔진 외에도 이미지가 필요하다
이미지는 컨테이너의 빵틀과도 같은 역할을 하는 것
이미지에는 많은 종류가 있다. 아파치 컨테이너를 만들려면 아파치 이미지를 사용하고, MySQL 컨테이너를 만들려면 MySQL 이미지를 사용한다.
용량이 허락하는 한, 하나의 도커에서 여러 개의 컨테이너를 만들 수 있다.
2-2. 도커의 작동
도커는 리눅스 상에서 동작한다.
Windows나 MacOS에서도 동작하지만 결국 내부적으로 리눅스가 개입한다. 또한, 컨테이너에서 동작시킨 프로그램도 리눅스용 프로그램이다.
도커란 무엇인가?
도커는 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어다. 주로 서버에 사용되며, 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다. 운영체제(비슷한 것) 통째로 격리하는 기능이다.