2) 도커(Docker) 커맨드 요약
도커 관련 개념
+ 도커 이미지
- 컨테이너 실행을 위해 필요한 프로그램/라이브러리/소스파일 등의 묶음
- docker build 명령으로 이미지 생성
- 이미지는 레지스트리에 존재
- 디폴트 레지스트리는 Docker Inc가 관리하는 퍼블릭 레지스트리인 도커 허브(Docker Hub)
+ Dockerfile
- 도커 이미지 생성을 위해 작성하는 파일
- C/C++ 빌드시 사용하는 Makefile에 해당
+ 도커 컨테이너
- 도커 이미지를 실행한 상태
- 하나의 이미지로 여러개의 컨테이너를 만들 수 있음
- docker run 커맨드로 컨테이너 실행
+ union mount
- 한번에 여러 파일 시스템 layer를 마운트 하지만 마치 하나의 파일 시스템처럼 보이도록 마운트
- 도커의 파일 시스템은 bootfs부터 layer 형태로 쌓인다
+ 복사후 쓰기 (Copy On Write)
- 파일을 변경하려면 그 파일은 아래에 존재하는 읽기-전용 레이어로부터 읽기-쓰기 레이어로 복사된다
- 파일의 읽기-전용 버전은 사라지는 것이 아니라 계속 존재
도커 관련 서비스
+ Quay
- 퍼블릭 & 프라이빗 레지스트리 서비스 제공
- 도커 허브의 대안
+ Orchard
- https://www.orchardup.com/
- Get Docker host in the cloud, instantly
- 프라이빗 레지스트리 서비스 제공
- 도커 컨테이너의 클라우드 호스팅 서비스 제공
- 유료 서비스
- Simple PaaS?
Docker 커맨드
+ docker attach 커맨드: 컨테이너에 재접속
+ docker build 커맨드: 도커 이미지 빌드
> -t 옵션: 레포지터리 이름을 지정
+ docker images 커맨드: 도커 이미지 리스트 확인
+ docker info 커맨드: 도커가 정상 동작하는지 확인
+ docker inspect 커맨드: 컨테이너 상세 정보 확인
+ docker logs 커맨드: 컨테이너의 로그를 가지고 온다
> -f 옵션: 로그 tailing
> -f --lines 옵션
> -t 옵션: 로그를 타임스탬프와 함께 출력
+ docker ps 커맨드: 실행중인 컨테이너 목록 확인
> -a 옵션: 중지된 컨테이너 포함, 모든 컨테이너 목록 표시
> -l 옵션: 포트 맵핑 확인
+ docker pull 커맨드: 도커 레지스트리에서 도커 이미지 가져오기
> 디폴트 레지스트리는 Docker Inc가 관리하는 퍼블릭 레지스트리인 도커 허브(Docker Hub)
+ docker push 커맨드: 이미지를 도커 허브에 넣는다
+ docker rm 커맨드: 컨테이너 제거
+ docker run 커맨드: 도커 컨테이너 실행
> -i 옵션: 컨테이너가 STDIN을 오픈해서 유지하도록 지정
> -t 옵션: 컨테이너에 pesudo-tty(터미널)를 할당
> 실행중인 컨테이너 내부에서
> ps 명령으로 컨테이너 프로세스 체크 가능
> apt-get 명령으로 SW 패키지 설치 가능
> --name 옵션: 컨테이너 이름을 지정
> 옵션을 사용하지 않으면 임의의 이름을 자동 할당
> -d 옵션: 컨테이너를 데몬 형태로 실행
> 포트 오픈 옵션
> -p 옵션: 컨테이너의 어떤 네트워크 포트를 오픈할지 지정
> Dockerfile의 EXPOSE 명령으로 지정한 포트의 오픈 여부가 실행단계에서 결정된다
> -P 옵션: Dockerfile에서 EXPOSE된 모든 포트를 오픈
> -v 옵션: 호스트에 있는 디렉터리를 컨테이너 안의 볼륨(디렉토리)으로 맵핑
> 어플리케이션이나 코드가 아직 완성되지 않아서 이미지에 포함하고 싶지 않은 경우 유용
> 목적지에 rw나 ro 옵션을 추가하여 목적지의 읽기/쓰기 상태 설정 가능
> --link 옵션: 컨테이너와 컨테이너의 네트워크를 연결
> 두개의 인자를 요구
> 하나는 링크할 컨테이너의 이름
> 다른 하나는 링크를 위한 alias
+ docker start 커맨드: 중지된 컨테이너 시작
+ docker stop 커맨드: 데몬 컨테이너를 중지
+ docker top 커맨드: 실행 중인 프로세스를 조사
Dockerfile 명령어
+ EXPOSE 명령: 컨테이너에 있는 어플리케이션이 컨테이너에 있는 특정 포트를 사용하도록 지정
> docker run 커맨드로 컨테이너를 실행할 때 포트를 오픈할 수 있도록 대기
+ ENV 명령: 이미지에 환경 변수 설정
> docker run 실행시 -e 옵션으로도 전달 가능
+ CMD 명령: docker run 커맨드로 컨테이너를 생성할 때 실행할 명령을 설정
+ ENTRYPOINT 명령: CMD와 유사, 쉽게 오버라이되지 않는 실행 명령을 설정
+ WORKDIR 명령: 컨테이너를 위한 작업 디렉터리 설정
> docker run 실행시 -w 옵션으로 오버라이딩 가능
+ VOLUME 명령: 컨테이너에 볼륨(디렉토리)을 추가
> 볼륨은 컨테이너 사이에서 공유되고 재사용된다
> 컨테이너는 볼륨을 공유하기 위해 실행될 필요 없다
> 볼륨에 대한 변경은 바로 적용된다
> 볼륨 변경은 이미지 업데이트시 포함되지 않는다
> 볼륨은 컨테이너가 사용하지 않을 때까지 유지된다
+ ADD 명령: 이미지에 파일과 디렉토리를 추가
+ COPY 명령: ADD 명령과 유사, 파일 복사에 집중, 자동 압축 해제 같은 기능 없음
출처: The Docker Book (지은이:제임스 턴불, 옮긴이:장독대, 출판사:루비페이퍼)
1. 윈도우에 다커 설치와 사용방법
win10 이하는 업데이트 후 사용. 정품 사용방법은 ~ 알아서
http://macaronics.net/index.php/m01/spring/view/864
1) Docker Container 를 실행하기 위한 환경 설정
# 명령어 보기
docker-machine help
#다커 머신 목록 보기
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.06.1-ce
#실행중인 머신이 없을 경우 생성해 준다.
https://docs.docker.com/machine/get-started/#create-a-machine
docker-machine create --driver virtualbox default
# 다커머신의 아이피
docker-machine ip
#다커 머신 환경 보기
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\Administrator\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
다커 이미지 저장소
https://hub.docker.com/explore/
우분트 설치 이지만 다운로드
#docker pull ubuntu
실행
#docker run --name jwp ubuntu
실행중이 프로세스 보기
#docker ps -a
삭제
#docker rm jwp
#데몬으로 실행
docker run -dit --name jwp ubuntu
#중지
docker stop jwp
#시작
docker start jwp
#접속
docker exec -it jwp /bin/bash
#빠져나오기
$ exit
종료 하지않고 빠져나오기
ctrl+p ctrl+ q
1. docker run -t -i
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나오게 되면 컨테이너를 현재 상태 그대로 두고 외부로 빠져나올 수 있다.
2. docker run -i
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나올 수 없다. 이 것은 stdin을 붕괴시킬 것이다.
3. docker run
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나올 수 없다.
- SIGKILL 시그널로 도커 컨테이너를 죽일 수 있다.
2) ubuntu 한글 버전 빌드 및 자바 설치
잘 되면 상관없지만 윈도우에서 Docker Quickstart Terminal 로 Dockerfile 을 생성이 안될 것이다.
따라서 cyg 을 설치해서 실행하면 된다.
cygwin 에 접속 후 /home/ 디렉토리 아래 docker-workspace 디렉토리를 생성후
Dockerfile 을 만들던지 아니면 다커 파일ㅣ 설치 된 위치에 가서 Dockerfile 을 직접 만들던지 해야 될 것 같다.
C:\Program Files\Docker Toolbox\
# 명령어 보기
$ docker-machine help
#다커 머신 목록 보기
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.06.1-ce
#실행중인 머신이 없을 경우 생성해 준다.
https://docs.docker.com/machine/get-started/#create-a-machine
docker-machine create --driver virtualbox default
# 다커머신의 아이피
docker-machine ip
#다커 머신 환경 보기
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\Administrator\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
다커 이미지 저장소
https://hub.docker.com/explore/
우분트 설치 이지만 다운로드
#docker pull ubuntu
실행
#docker run --name jwp ubuntu
실행중이 프로세스 보기
#docker ps -a
삭제
#docker rm jwp
#데몬으로 실행
docker run -dit --name jwp ubuntu
#중시
docker stop jwp
#시작
docker start jwp
#접속
docker exec -it jwp /bin/bash
docker ubuntu 한글 버전
#rm -rf Dockerfile
#vi Dockerfile
-----------------------------------------------------
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y language-pack-ko
# set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
CMD /bin/bash
-----------------------------------------------------
설치
#docker build --tag han_ubuntu:latest ./
#docker images
#eval $(docker-machine env default)
#docker images
윈도우일 경우 여기까지 Cyg-win 에서 실행 했으면 다음은
Docker Quickstart Terminal 에서만 실행가능하다.
실행
$ docker run -it --name han_ubuntu han_ubuntu /bin/bash
#locale 환경 확인
#백그라운드에서 실행
$ docker run -dit --name han_ubuntu /bin/bash
실행중이 컨테이너 확인
#docker ps -a
#docker start han_ubuntu
접속
$ docker exec -it han_ubuntu /bin/bash
다음 명령어로 백그라운드 실행 -it
$ docker run -it han_ubuntu /bin/bash
빠져나오기
$ exit
종료 하지않고 빠져나오기
ctrl+p ctrl+ q
1) 일단 백그라운드로 이미지 실행.
[zany@zany-mbp ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-k base 8032edd0e365 2 days ago 696MB
ubuntu-k base 53df1830a2ad 2 days ago 454MB
centos initial 00e793839a1f 2 days ago 349MB
centos base b1143c4a0cc1 2 days ago 197MB
ubuntu base bd3d4369aebc 10 months ago 127MB
[zany@zany-mbp ~]$
● 아래는 -itd 옵션에 대한 설명이다.
tty 사용을 위해서 -it 옵션은 무조건 주어야 하고,
컨테이너를 백그라운드로 띄울 것인지만 -d 옵션을 사용하여 선택적으로 적용하면 된다.
여기서는 컨테이너를 백그라운드로 실행할 것이므로 -itd 옵션을 사용할 것이다.
docker run -itd [image-id] /bin/bash
-i, --interactive : Keep STDIN open even if not attached
-t, --tty : Allocate a pseudo-TTY
-d, --detach : Run container in background and print container ID
[zany@zany-mbp ~]$ docker run -itd 8032edd0e365 /bin/bash
ca006a7319393f06af1659bed3282e194ead662c212ff007e41b622187eca527
[zany@zany-mbp ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca006a731939 8032edd0e365 "/bin/bash" 6 seconds ago Up 5 seconds blissful_golick
2) docker exec 명령에 컨테이너 아이디를 인자로 넘겨 interactive tty open.
docker exec -it [container-id] /bin/bash
(docker 1.3 부터 지원)
[zany@zany-mbp ~]$ docker exec -it ca006a731939 /bin/bash
[root@ca006a731939 /]#
my-slipp 우분트 생성 및 백그라운드 실행
$ docker run -dit --name my-slipp han_ubuntu
접속
$ docker exec -it my-slipp /bin/bash
root@ede7ff27d3c8:/usr# mkdir apps
root@ede7ff27d3c8:/usr# cd apps
root@ede7ff27d3c8:/usr/apps# ll
합계 8
drwxr-xr-x 2 root root 4096 10월 5 06:26 ./
drwxr-xr-x 16 root root 4096 10월 5 06:26 ../
#apt-get install wget
# wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
파일 압축 풀기
# gunzip jdk-8u141-linux-x64.tar.gz
=>
tar.gz 압축이 풀리면 .tar 로 변경 된다.
이파일 다시 압축을 푼다.
[root@localhost local]# tar -xvf jdk-8u141-linux-x64.tar
심볼릭 링크를 적용한다.
- 윈도우의 바로가기 명령어
[root@localhost local]# ln -s jdk1.8.0_141/ java
vi 가 설치가 안 되어 있으면 다음 명령어로 설치
# apt-get install vim
자바 환경변수 설정
/etc/profile 사용자가 로그인했을 때 적용되는 스크립트, 도스의 autoexec.bat 과 비슷
사용자가 로그인하면 /etc/profile 과 각 사용자의 .profile 스크립트가 실행됨
/etc/profile 모든 사용자게 공통적으로 적용
.profile 사용자별로 적용됨
자동실행파일 실행순서
/etc/profile
/etc/bashrc
~/.bashrc
~/.bash_profile
# gedit /etc/profile
맨 아래에 내용 추가
export JAVA_HOME=/usr/apps/java
export PATH=$PATH:$JAVA_HOME/bin
export JAVA_OPTS="-Dfile.encoding=UTF-8"
export CLASSPATH="."
수정된 사항을 시스템에 적용
# source /etc/profile
3) Dockerfile을 활용해 나만의 Docker 이미지 만들기
https://hub.docker.com/r/stephenreed/jenkins-java8-maven-git/
젠키스 + java + 메이븐 + git 이미지로 실행
윈도우에서 다커 파일 수정 하고 빌들 할 때에는 cygwin 에서 실행 하던지
$ docker login --username XXXXX --password xxxxx
으로 로그인 후 실행하던지
노트패드로 Dockerfile 을 만들고 Docker Quickstart Terminal 로 실행
C:\Program Files\Docker Toolbox\docker-workspace
위 젠키스 + java + 메이븐 + git 이미지로 실행 는 로그인이 필요하기 때문에
docker login
Docker Quickstart Terminal 에서 만 가능할 것같다.
https://docs.docker.com/engine/reference/builder/#usage
$vi Dockerfile
----------------------------------------------------------
FROM podbox/java8
RUN apt-get update
RUN apt-get install -y language-pack-ko
# set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
CMD /bin/bash
-------------------------------------------------------------------
검색
$ docker search java8
로그인 후
ko_java 이름은 자유
이미지 빌드
$ docker build -t ko_java .
Administrator@8WWZYNOG30EGKNH MINGW64 /c/Program Files/Docker Toolbox/docker-workspace
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ko_java latest 6a23523b9235 40 seconds ago 415MB
$이미지 실행 및 접속
Administrator@8WWZYNOG30EGKNH MINGW64 /c/Program Files/Docker Toolbox/docker-workspace
$ docker run -it --name my_java ko_java /bin/bash
root@5383f5697d14:/#
$ exit
종료 하지않고 빠져나오기
ctrl+p ctrl+ q
다시 접속 하기
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5383f5697d14 ko_java "/bin/bash" 4 minutes ago Up 2 minutes my_java
컨테이너에 있는 아이디 두자리만 입력 해도 된다. (아이디값이 앞자리가 1~2 자리가 유일하다면)
Administrator@8WWZYNOG30EGKNH MINGW64 /c/Program Files/Docker Toolbox/docker-workspace
$ docker exec -it 53 /bin/bash
멀티 빌드 추가 방법
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context
----------------------------------------------------------------------
FROM podbox/java8
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
#vim install
RUN apt-get install -y \
vim \
git \
nmap \
CMD /bin/bash
----------------------------------------------------------------------
java8, maven , git 통합 설치
---------------------------------------------------------------------
FROM podbox/java8
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
#vim install
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y vim
RUN apt-get install -y nmap
RUN apt-get install -y maven
ENV MAVEN /usr/share/maven/bin:$MAVEN
CMD /bin/bash
--------------------------------------------
$ docker build -t maven_java .
4) 4. Docker에 내가 구현한 소스 코드 배포하기
https://github.com/braverokmc79/springboot_myslipp2.git
-dit는 d, i, t 옵션을 줄인 것이고 각각은 다음과 같다.
-d, –detach 도커 커맨드를 백그라운드에서 실행
-i, –interactive Attach되지 않았을 때에도 STDIN을 열어둔다.
-t, –tty pseudo-TTY를 할당한다.
$docker images
다커머신 7000번 : 다커 컨테이너 8079
$docker run -dit --name my-slipp -p 7000:8079 my-dev
$docker ps
다커컨테이너로 들어가기
$docker exec -it my-slipp /bin/bash
이미지 명 접근이 안될 경우 아이디로 접근 할것
$docker exec -it 706 /bin/bash
$ docker exec -it 706 /bin/bash
apps 디렉토리생성
root@706569a08341:/# mkdir /usr/apps
root@706569a08341:/# ls
bin boot core dev etc home jdk lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@706569a08341:/# cd /usr/apps/
root@706569a08341:/usr/apps# git clone https://github.com/braverokmc79/springboot_myslipp2.git
'springboot_myslipp2'에 복제합니다...
#git check out
#./mvnw clean package
다커 컨테이너에 들어가서 스프링부트 실행
# ./mvnw spring-boot:run
실행중이 프로세스 확인
# ps -e | grep java
# git branch -a
root@706569a08341:/usr/apps/springboot_myslipp2# git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
1)다커 컨테이너 할당된 아이피 값
docker inspect 아이디값
"IPAddress": "172.17.0.2",
2) 다커 머신 아이피 확인하기
docker-machine ip
192.168.99.100
192.168.99.100:7000 으로 접근
$ docker run -dit --name my-slipp -p 7000:8079 my_maven2
배포는 1번 글 참조 할것
2. 리눅스 설치
http://pyrasis.com/Docker/Docker-HOWTO
1.다커 설치
curl -fsSL https://get.docker.com/ | sudo sh
Docker를 업데이트
$ sudo yum update docker-io
2. sudo 없이 사용하기
docker는 기본적으로 root권한이 필요합니다.
root가 아닌 사용자가 sudo없이 사용하려면 해당 사용자를 docker그룹에 추가합니다.
sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기
#sudo usermod -aG docker ubuntu
#sudo usermod -aG docker ubuntu
3.버전 확인
#docker version
#docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
#$ mysql -h127.0.0.1 -uroot
4 .docker 설치한 container에 접속하기
# docker ps -a
접속하는 방법은 매우 간단하다.
docker exec 명령을 이용하면 된다. docker exec 는 container에 특정 명령을 실행할 수 있는 것인데 이때 명령을 /bin/bash 라고 하면 된다.
우리가 "접속" 하고 싶다는 의미는 해당 container 의 shell 에 접속하겠다는 의미이다.
주의해야할 것은 docker exec 명령을 할때 옵션으로 -it 라고 덧붙여 주어야 한다. 이는 STDIN 표준 입출력을 열고 가상 tty (pseudo-TTY) 를 통해 접속하겠다는 의미이다.
컨테이너 아디값은 랜덤생성되고
접속하고자 하는 CONTAINER ID 값을 입력해 준다. c456623003b1 값은 mysql 아이값이다.
# docker exec -it c456623003b1 /bin/bash
mysql 컨테이너에 접속하엿다. 다음 명령어로 mysql 을 시작한다.
#mysql -h127.0.0.1 -uroot
5. 도커 컨테이너에서 빠져나오기
exit
1. docker run -t -i
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나오게 되면 컨테이너를 현재 상태 그대로 두고 외부로 빠져나올 수 있다.
2. docker run -i
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나올 수 없다. 이 것은 stdin을 붕괴시킬 것이다.
3. docker run
- [Ctrl + P] + [Ctrl + Q]로 컨테이너에서 빠져나올 수 없다.
- SIGKILL 시그널로 도커 컨테이너를 죽일 수 있다
6. 컨테이너 중지하기 (stop)
실행중인 컨테이너를 중지하는 명령어는 다음과 같습니다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker ps # get container ID
docker stop ${TENSORFLOW_CONTAINER_ID}
docker ps -a # show all containers
도커 ID의 전체 길이는 64자리 입니다. 하지만 명령어의 인자로 전달할 때는 전부 입력하지 않아도 됩니다.
예를 들어 ID가 abcdefgh...라면 abcd만 입력해도 됩니다.
앞부분이 겹치지 않는다면 1-2자만 입력해도 됩니다.
7.컨테이너 제거하기 (rm)
docker ps -a # get container ID
docker rm ${UBUNTU_CONTAINER_ID} ${TENSORFLOW_CONTAINER_ID}
docker ps -a # check exist
컨테이너가 말끔히 삭제되었습니다.
호스트 OS는 아무런 흔적도 남아있지 않고 컨테이너만 격리된 상태로 실행되었다가 삭제되었습니다.
시스템이 꼬일 걱정이 없습니다.
복수개 삭제도 가능
$ docker rm [컨테이너id], [컨테이너id]
컨테이너 모두 삭제
$ docker rm `docker ps -a -q`
8. 중지된 컨테이너 ID를 가져와서 한번에 삭제
docker rm -v $(docker ps -a -q -f status=exited)
9. 이미지 삭제
현재 이미지 확인
$ docker images
$ docker rmi [이미지id]
컨테이너를 삭제하기 전에 이미지를 삭제할 경우
-f 옵션을 붙이면 컨테이너도 강제삭제
$ docker rmi -f [이미지id]
컨테이너 전체 중지
$ docker stop $(docker ps -a -q)
컨테이너 전체 삭제
$ docker rm $(docker ps -a -q)
이미지 전체 삭제
$ docker rmi $(docker images -q)
Docker Tomcat Install (도커 톰캣 설치)
https://sarc.io/index.php/tomcat/1290-docker-tomcat-install
3. AWS Docker 로 10분안에 서버 구축 - 우분트 최신버전
다음 글 참조
설치
ubuntu:latest , java8 , maven, mariadb, git, jenkins , smtp
Dockerfile
-----------------------------------------------------------------------------------------------
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y language-pack-ko
#set locale ko_KR
RUN locale-gen ko_KR.UTF-8
ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8
# 필요한것들 install
RUN apt-get install -y systemd
RUN apt-get install -y net-tools
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y vim
RUN apt-get install -y nmap
RUN apt-get install -y unzip
# java 8 설치
RUN wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
RUN tar xzvf jdk-8u141-linux-x64.tar.gz
RUN ln -s jdk1.8.0_141/ java
ENV PATH /java/bin:$PATH
#tomcat8.5 install 설치 위치는 /
RUN wget http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
RUN tar xzvf apache-tomcat-8.5.34.tar.gz
RUN ln -s apache-tomcat-8.5.34 tomcat8.5
#메이븐 설치 및 환경
RUN wget http://mirrors.koehn.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.zip
RUN unzip apache-maven-3.5.4-bin.zip
RUN ln -s apache-maven-3.5.4 maven
ENV PATH /maven/bin:$PATH
#mariadb 설치
RUN apt-get install software-properties-common -y
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
RUN sh -c "echo 'deb https://mirrors.evowise.com/mariadb/repo/10.2/ubuntu '$(lsb_release -cs)' main' > /etc/apt/sources.list.d/MariaDB.list"
RUN apt-get install mariadb-server mariadb-client -y
RUN systemctl enable mariadb.service
EXPOSE 8079
EXPOSE 8080
EXPOSE 3306
CMD /bin/bash
-----------------------------------------------------------------------------------------------
빌드
#docker build -t jh .
#docker run -dit --name jh -p 8080:8080 -p 3306:3306 jh
컨테이너로 들어가기
#docker exec -it jh bin/bash
설치 확인
#grep . /etc/*-release
#java -version
#git --version
#mvn --version
#mariadb --version
#루트디렉토리에 톰켓 확인
#ls -al
mariadb 설정 변경
mysql_secure_installation 이것으로 설정하지 않는다.
root 비밀번호 분실시
마리아디 root 비밀번호 재설정
# service mysql stop
# mysqld_safe --skip-grant-tables --skip-networking &
# mysql -u root
# use mysql;
# update user set password=PASSWORD("new_password_here") where User='root';
-- update user set password=PASSWORD("1111") where User='root';
flush privileges;
Docker-compose 설치
curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
[출처] 64. [Docker] Docker Compose 간단 사용 후기|작성자 alice
다운로드
# root로 로그인해야한다. $ curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
실행 권한 부여
$ chmod +x /usr/local/bin/docker-compose # 설치 확인 $ docker-compose --version docker-compose version 1.14.0, build 1719ceb
설치가 완료되었다.
[Nginx] Ubuntu에서 apt-get을 통해 Nginx 설치하기 및 간단한 정리
package를 통한 nginx 설치
nginx를 설치하는 방법에는 apt-get을 통한 방식과 직접 소스코드를 내려받아서 컴파일하는 2가지 방식이 있습니다. 더 편하고 빠른 방식은 package를 통한 방식이라 apt-get을 이용해서 설치하겠습니다.
$ sudo apt-get install nginx
다음 명령어를 통해서 버전도 확인하고 설치가 되었는지 확인해봅시다.
$ nginx -v nginx version: nginx/1.4.6 (Ubuntu)
코드를 직접 받아서 make를 통한 직접 컴파일을 해서 설치하는 부분은 현재 진행하는 프로젝트가 끝나고 해보도록 하겠습니다.:)
Nginx에 대해서 간략하게
Nginx?
Apache처럼 웹서버 환경을 만들어주는 소프트웨어입니다.
웹서버?
웹서버란 전체 서버 아키텍처의 앞단에서 HTTP 요청에 따라서 그 요청을 넘기고 그에 해당하는 file 혹은 리소스를 넘겨주는 역할을 하는 부분입니다.
시장 점유율
현재 2018년 기준 w3techs에 따르면 38.0%의 사이트들이 사용하고 있다고 함니다.(해당링크)
Apache와의 차이점 및 장점
구조적인면에 있어서 Apache의 경우에는 요청마다 스레드 혹은 프로세스 기반으로 처리하는데, Nginx의 경우에는 이러한 구조 대신에 요청을 비동기 이벤트 구조로 구동됩니다. 그래서 구글에 있는 글들에 의하면 더 적은 리소스를 효율적으로 사용 할 수 있다고 나와 있습니다.
- Apache : 요청마다 스레드 혹은 프로세스 생성 및 처리
- Nginx : 요청마다 비동기 이벤트를 발생시켜 처리
nginx 사용 명령어
// 시작 $ sudo service nginx start $ sudo systemctl start nginx $ sudo /etc/init.d/nginx start // 재시작 $ sudo service nginx restart $ sudo systemctl restart nginx $ sudo /etc/init.d/nginx restart // 중지 $ sudo service nginx stop $ sudo systemctl stop nginx $ sudo /etc/init.d/nginx stop // 상태 $ sudo service nginx status $ sudo systemctl status nginx // 설정 reload $ sudo service nginx reload $ sudo systemctl reload nginx $ sudo nginx -s reload // configuration file syntax check $ sudo nginx -t
nginx 설정
설정 파일들 경로
nginx 설치 방법에는 2가지 방법이 있다고 했다. 각 설치법에 따라서 환경설정 파일의 위치가 다르다.
- package(apt-get을 통한 설치)의 경우 : /etc/nginx에 위치
- 직접 compile한 경우 : /usr/local/nginx/conf, /usr/local/etc/nginx
위에 3개의 폴더중에는 한 곳에 위치하게 되어있지만 다음 명령어를 통해서도 찾을 수 있다고 합니다.
$ sudo find / -name nginx.conf
설정 파일들
모든 설정파일들을 건드려보지 않았기에 설정 할 때 필요한 몇가지 파일 및 폴더들만 보겠습니다.
nginx.conf : nginx와 그 모듈들이 작동하는 방식에 대한 설정 파일입니다. sites-enabled안에 각각 서버에 대한 conf파일들을 만들고 이 안에 첨부하여 웹서버를 운영할 수 있습니다. conf 파일안을 보시면 http, server, location, upstream과 같이 나누어져 있는데 이를 블록이라 하며 server는 가상 서버 혹은 일반 서버를 호스팅 할 때 사용되며 location의 경우 특정 폴더 밑 파일에 대한 경로를 지정해주고 upstream의 경우 Reverse Proxy 설정을 위해서 사용됩니다.
sites-enabled : 위에서 말한 nginx.conf에 첨부해서 실제로 서버를 운영할 설정 파일들이 들어있는 폴더입니다. 실제로 코드를 보면 nginx.conf에서 여기 폴더에 있는 모든 파일들을 불러옵니다.
fastcgi_params, scgi_params, uwsgi_params : uwsgi와 같이 웹 서버와 애플리케이션 서버 사이에서 인터페이스 역할을 해줄 때 필요한 파일들입니다.
파일을 어떻게 사용하는지에 대한 간단한 설명은 다음 포스팅에서 Nginx-uWSGI-Django 연결 편에서 사용해볼 예정입니다.
접속을 통한 확인
이제 설치가 모두 되었다면 자신의 컴퓨터의 IP주소를 브라우저 창에 치면 아래와 같이 “Welcome to nginx”가 나와야합니다.
제 경우에는 Domain이 있어서 도메인 명을 통해서 접속하였습니다.
완료된 현재 구조
현재 구조는 현재 아래처럼 웹 클라이언트가 현재 내 웹 서버에 Nginx를 통해서 접근하고 가장 기본 index.html을 띄워주는 구조로 되어있습니다.
- Web Client <-> Web Server(Nginx)
LetsEncrypt 무료 SSL인증서 적용 및 자동 갱신하기
Certbot 로 발급 받은 것이지만 LetsEncrypt 이다.
2. https://blog.perfectacle.com/2017/10/05/letsencrypt-with-certbot-feat-aws/
Nginx 서비스 정지
현재 서버를 구동중이라면 인증서 생성 시 문제가 발생할 수 있으므로 nginx 서비스를 중단한다.
systemctl stop nginx
위 두사이트를 보고 진행하였다.
aws 도메인을 사용했는데 , 안되었다. 그래서 freenom.com 무료 도메인 구입후 진행하였다.
myssl.ml
1번에서 apt-get install letsencrypt -y 설치하였으나 우분트 버전차이인지 설치가 안되었다
그래서 2번링크에서 다음과 같이 진행하였다.
curl -O https://dl.eff.org/certbot-auto
chmod +x certbot-auto
mv certbot-auto /usr/bin/certbot-auto
그리고 실제 SSL 인증서를 발급받아보도록 하자.
현재 AWS Linux는 아직 정식 지원이 아닌지 –debug를 붙여줘야한다.
certbot-auto certonly --standalone -d 발급받을도메인
certbot-auto certonly --standalone --webroot-path=/home/ubuntu -d myssl.ml
SSL 인증서 생성
위와 같이 했더니, ls -al /etc/letsencrypt/archive/
ls -al /etc/letsencrypt/archive/
myssl.ml 폴더가 설치 되었고. myssl.ml 폴더에는 다음과 같은 파일들이 설치 되었다.
root@ip-172-31-21-231:/etc/nginx/conf.d# ls -al /etc/letsencrypt/archive/myssl.ml/
total 24
drwxr-xr-x 2 root root 4096 Oct 19 15:01 .
drwx------ 3 root root 4096 Oct 19 15:01 ..
-rw-r--r-- 1 root root 2130 Oct 19 15:01 cert1.pem
-rw-r--r-- 1 root root 1647 Oct 19 15:01 chain1.pem
-rw-r--r-- 1 root root 3777 Oct 19 15:01 fullchain1.pem
-rw-r--r-- 1 root root 1704 Oct 19 15:01 privkey1.pem
Strong Diffie-Hellman Group 생성
더 강력한 보안을 위해 아래 명령어를 통해 2048 비트나 4096 비트 암호화를 적용시켜 줄 수 있다.
높은 비트의 암호화를 적용시키다보니 생성하는데 몇 분 이상의 시간이 소요될 수 있고,
결과 파일은 명령어에서 지정한 대로 dhparam 파일에 저장된다.
여기서는 2048 비트를 적용하였다.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Nginx 설정에 적용할 파일 생성
차후 설정을 쉽게 적용, 변경할 수 있도록 /etc/nginx/snippets 디렉토리에 아래와 같은 2개의 파일을 만든다. example.com 부분은 자신의 도메인명을 적어주면 된다.
sudo vi /etc/nginx/snippets/ssl-example.com.conf
sudo vi /etc/nginx/snippets/ssl-params.conf
ssl-example.com.conf 파일 내용
이 파일은 아까 설정한 SSL 인증서 경로를 지정해주는 역할을 한다.
아래 2줄을 입력한 뒤 저장하고 빠져나오자.
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
=> 도메인
ssl_certificate /etc/letsencrypt/live/myssl.ml/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myssl.ml/privkey.pem;
/etc/nginx/snippets/ssl-params.conf
이 파일은 SSL 보안에 관한 설정을 해주기 위한 것으로, 물론 필수는 아니지만 설정해주는 것이 좋다.
아래 설정정보는 여기를 참고하였으며, 위에서 생성해두었던 dhparam 암호화 파일은 최하단 부분에서
불러오고 있다는 점을 확인하고 넘어가자.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
#resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Nginx 설정 파일 수정
이제 sites-available의 nginx 파일을 수정해줄 차례다.
default 파일을 그대로 사용해도 되고 다른 파일을 만들어줘도 되는데, default 파일을 사용한다면 미리 백업을 해두는 것이 좋겠다.
sudo vi /etc/nginx/sites-available/default
만약을 대비해 default 카피로 백업해 두자
일단 파일을 열고 아래 내용을 작성한다.
이것은 example.com 과 www.example.com 에 http, 80번 포트로 들어오는 모든 요청을
https 로 받아들이겠다는 내용이다.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
그리고 동일한 파일 내에 또 다른 서버블록을 만들어 다음 내용을 입력한다.
추가로 필요한 설정이 있다면 이 곳에 같이 입력한다.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
}
=>
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name myssl.ml www.myssl.ml;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
}
위와 같이 입력했을 경우 80번 포트는 사용하지 않고 443 포트로만 사용하겠다는 것인데,
굳이 두 포트를 모두 사용하겠다면 두 개로 나눈 서버 블록을 한 곳에 같이 입력해주면 된다.
그리고 위 설정을 default 파일에 했다면 상관없지만, 다른 파일을 생성했다면 /etc/nginx/enables 디렉토리에 심볼릭 링크를 걸어주어야 한다. example 부분을 자신이 만든 파일이름으로 바꿔주자
sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled
이제 nginx 설정에 이상이 없는지 체크해본다.
nginx -t 명령을 입력하고 아래와 같이 나오면 성공이다.
root@ip-172-31-21-231:/etc/nginx/sites-available# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
서버환경에 따라 서버환경에 맞게
HTTPS 방화벽 설정
sudo ufw allow 'Nginx Full'
만약 https 로 암호화 통신만 하고 HTTP 를 사용하지 않겠다면 아래 설정을 추가한다.
sudo ufw delete allow 'Nginx HTTP'
status 명령으로 제대로 설정되었는지 확인해본다.
sudo ufw status
nginx 구동
service nginx start
ssl 검증 사이트
https://www.ssllabs.com/ssltest/analyze.html
자동 갱신하기
Certbot으로 발급 받았다 하더라도 Let’s Encrypt의 SSL 인증서를 발급받은 것이기 때문에 유효기간은 90일이다.
따라서 수동으로 갱신할 때 명령어는 다음과 같다.
certbot-auto renew
하지만 갱신일이 30일 이상 남은 경우에는 아래와 같은 오류를 보게될 것이다.
Cert not yet due for renewal
따라서 테스트를 위해서는 –dry-run 옵션을 추가해야한다.
certbot-auto renew --dry-run
하지만 이번에는 아래와 같은 오류가 나게 된다.
produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.
All renewal attempts failed. The following certs could not be renewed
갱신하려는 인증서를 이미 nginx 서버에서 사용중이기 때문에 갱신이 불가능하다는 내용이다.
따라서 nginx를 스탑하고 갱신하고 다시 start 해야하는데 귀찮으므로 hook 옵션을 제공해서 아래와 같이 사용하면 된다.
certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start" --dry-run
드디어 아래와 같은 성공 메시지를 보게 될 것이다.
Congratulations, all renewals succeeded. The following certs have been renewed:
하지만 아직 테스트 단계이므로 실제로 갱신이 이루어지지는 않는다.
갱신일이 궁금하다면 아래 커맨드를 입력하면 된다.
echo | openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -dates
30일 남았는지 일일이 체크해서 갱신하기란 매우 귀찮다.
따라서 매달 1일에 갱신하는 커맨드를 실행하게 끔 crontab을 사용하자.
# 잡을 등록
crontab -e
# 그리고 아래 잡을 추가하고 저장하자.
0 0 1 * * certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"
# 등록된 잡 목록 보기
crontab -l
crontab 규칙은 crontab.guru에서 확인할 수 있고, 직접 만들거나 결과를 예측해볼 수도 있다.
Docker 톰캣 nginx ssl 연동
#/etc/nginx/sites-available
댓글 ( 10)
댓글 남기기