반응형

Docker는 애플리케이션을 "컨테이너"라는 독립된 환경에서 실행할 수 있도록 해주는 "컨테이너화 플랫폼"입니다. Docker는 애플리케이션과 필요한 라이브러리, 종속성을 하나의 이미지로 묶어 배포하므로, 개발 환경과 운영 환경 간의 차이로 발생하는 문제를 줄여주며 일관된 환경에서 애플리케이션을 실행할 수 있게 해줍니다.


Docker의 개념

- 컨테이너: 애플리케이션과 그 실행에 필요한 모든 요소를 포함하는 독립적인 실행 환경입니다. 컨테이너는 가상 머신(VM)과 달리 운영 체제를 공유하여 가볍고 빠르게 실행됩니다.
- 이미지: 컨테이너의 원본 파일 시스템입니다. 이미지는 코드, 런타임, 라이브러리 등 컨테이너 실행에 필요한 모든 요소를 포함하며, 이를 기반으로 여러 컨테이너를 생성할 수 있습니다.
- Docker Hub: Docker 이미지 저장소로, 다양한 이미지들을 다운로드하여 사용할 수 있습니다.

 

Docker의 활용

1. 개발 환경 설정: Docker를 이용해 특정 버전의 개발 환경을 쉽게 설정하고 공유할 수 있습니다.
2. 애플리케이션 배포: 일관된 환경을 제공하므로 개발에서 테스트, 운영까지 같은 이미지를 사용해 손쉽게 배포할 수 있습니다.
3. 마이크로서비스: 각 서비스가 독립된 컨테이너에서 실행되도록 구성해, 마이크로서비스 아키텍처를 효과적으로 구현할 수 있습니다.
4. 지속적 통합 및 배포(CI/CD): Docker는 자동화된 테스트와 배포 파이프라인에서 일관된 환경을 제공하여 신속한 CI/CD 구현을 지원합니다.

Docker는 개발과 배포의 일관성을 유지하고, 경량화된 컨테이너 환경을 통해 서버 자원을 효율적으로 사용할 수 있게 하여, 개발자와 운영팀의 생산성을 높여줍니다.

 

이미지 관리

 

이미지 검색하기
sudo docker search centos

이미지를 다운로드
sudo docker pull centos:latest

이미지 목록 출력
sudo docker images

이미지 삭제
sudo docker rmi ubuntu:latest

 

 

컨테이너 관리

컨테이너 생성하기
sudo docker run -i -t --name hello ubuntu /bin/bash
 > -i(interactive), -t(Pseudo-tty) 옵션을 사용하면 실행된 Bash 셸에 입력 및 출력을 할 수 있습니다.
 > --name 옵션으로 컨테이너의 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 Docker가 자동으로 이름을 생성하여 지정합니다


컨테이너 시작
sudo docker start hello

컨테이너 종료
sudo docker stop hello

컨테이너 재시작
sudo docker restart hello

컨테이너 접속
sudo docker attach hello

컨테이너 안의 명령 실행
sudo docker exec hello echo "Hello World"

실행된 컨테이너 목록을 출력
sudo docker ps

전체 컨테이너 목록을 출력
sudo docker ps -a

컨테이너 삭제
sudo docker rm hello

 

 

데이터베이스 구성 예시

 

mysql 구성

 -컨테이너 생성
 $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-새로운 컨테이너를 시작하고 원래  mysql 컨테이너에 대해  mysql 명령을 실행
 $ docker run -it --netwo성rk some-network --rm mysql mysql -hsome-mysql -uexample-user -p

-이 이미지는 Docker가 아닌 또는 원격 인스턴스의 클라이언트로도 사용할 수 있습니다.
 $ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p

Mysql 컨테이너에 root계정의 bash로 접속
$ docker exec -it -u root mysql-5.7 bash


Oracle 11g 구성

Oracle 11g 다운로드
 $ docker pull jaspeen/oracle-xe-11g

Oracle 11g 컨테이너 생성
 $ docker run --name oracle11c -d -p 1521:1521 jaspeen/oracle-xe-11g

oracle 11g 실행하기 
docker exec -it oracle11g sqlplus

계정: system  암호: oracle


Dockerfile 작성

FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.com></foo@bar.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]

WORKDIR /etc/nginx

CMD ["nginx"]

EXPOSE 80
EXPOSE 443


-FROM: 어떤 이미지를 기반으로 할지 설정합니다. Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성합니다. <이미지 이름>:<태그> 형식으로 설정합니다.
-MAINTAINER: 메인테이너 정보입니다.
-RUN: 셸 스크립트 혹은 명령을 실행합니다.  
 > 이미지 생성 중에는 사용자 입력을 받을 수 없으므로 apt-get install 명령에서 -y 옵션을 사용합니다(yum install도 동일).
 > 나머지는 nginx 설정입니다.
 > VOLUME: 호스트와 공유할 디렉터리 목록입니다. docker run 명령에서 -v 옵션으로 설정할 수 있습니다.
   예) -v /root/data:/data는 호스트의 /root/data 디렉터리를 Docker 컨테이너의 /data 디렉터리에 연결합니다.
-CMD: 컨테이너가 시작되었을 때 실행할 실행 파일 또는 셸 스크립트입니다.
-WORKDIR: CMD에서 설정한 실행 파일이 실행될 디렉터리입니다.
-EXPOSE: 호스트와 연결할 포트 번호입니다.

 

Dockerfile 설명(Jboss)

# jboss/base-jdk:8 이미지를 기본으로 한다.
FROM jboss/base-jdk:8
 
# local directory에 있는 wildfly-12.0.0.Final.tar.gz를 생성되는 Docker Image 내부의 /opt 로 복사 및 압축을 해제한다.
# local directory에 있는 파일의 경로는 해당 Dockerfile의 상대경로를 작성해야 한다.
ADD ./wildfly-12.0.0.Final.tar.gz /opt
 
# 생성되는 Docker Image의 환경변수를 지정한다.
ENV WILDFLY_VERSION 12.0.0.Final
ENV JBOSS_HOME /was/wildfly-$WILDFLY_VERSION
 
# 생성되는 Docker Image의 User를 root로 변경한다.
USER root
 
# 환경변수로 지정한 JBOSS_HOME Directory의 파일 소유자, 권한을 변경한다.
# 예제에서는 jboss 사용자에게 JBOSS_HOME Directory를 접근할 수 있는 권한을 주고 있음.
RUN chown -R jboss:0 ${JBOSS_HOME} \
    && chmod -R g+rw ${JBOSS_HOME}
 
# 환경변수 지정(Wildfly를 background에서 동작하게 한다.)
# 해당 옵션을 지정하지 않으면 컨테이너를 종료시킬 때 강제로 종료(sudo docker kill {containerID})시켜야 한다.
ENV LAUNCH_JBOSS_IN_BACKGROUND true
 
# 현재 사용자를 root에서 jboss로 변경한다.
USER jboss
 
# 컨테이너가 실행되었을 때 요청을 기다리고 있는 포트를 지정한다.
EXPOSE 8080
 
# 컨테이너가 실행되었을 때 실행되는 명령어를 정의한다.
# 예제에서는 standalone로 wildfly를 실행하고 모든 ip address에 bind를 하는 옵션을 주고 있다.(ip지정시 해당 ip만 접속이 허용됨)
CMD ["/was/wildfly-12.0.0.Final/bin/standalone.sh", "-b", "0.0.0.0"]


이미지 생성 및 파일 이동

이미지 생성(Dockerfile)
sudo docker build --tag hello:0.1 .

이미지 히스토리 조회
sudo docker history hello:0.1

컨테이너의 파일 꺼내기
sudo docker cp hello-nginx:/etc/nginx/nginx.conf ./

컨테이너의 변경사항을 이미지로 생성
sudo docker commit -; "Foo Bar <foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2

컨테이너에서 변경된 파일 확인
sudo docker diff hello-nginx

이미지,컨테이너 세부 정보 출력
sudo docker inspect hello-nginx

+ Recent posts