0. 프로젝트명 : 우분투 도커 환경을 이용한 Java Spring 웹 페이지 서버 구현

1. 목적 : 도커를 이용해 서버를 구축, 웹페이지를 구동한다.

2.기대효과 : 쉬운 배포 및 이식성

3. 개발환경 : Docker Engine 19.03.12, build 48a66213fe
                    Docker-compose 1.26.0, built d4451659
                     (Host OS : Ubuntu 18.04.3 LTS)

                     Dokcer image : Ubuntu:20.04 (오리지널 우분투에서 18.04 다음 LTS 버전이 20.04라서)

 

 

## curl 설치
sudo apt update
sudo apt install curl

## dockder engine 설치
curl -s https://get.docker.com | sudo sh
docker -v

## docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

## 일반 사용자 도커 그룹에 넣기
sudo usermod -aG docker $USER    ## 현재 접속 중인 사용자를 도커 그룹에 넣기
sudo su - $USER   ## 적용을 위해 현재 사용자 재로그인 하기

## 우분투 이미지 가져오기
docker pull ubuntu:20.04

## 우분투 컨테이너 생성
docker run -d -it --name ub ubuntu:20.04 /bin/bash

 

 

주의!!! 여기서부터는 우분투 내에서 하는게 아니고 도커 내 우분투 컨테이너에서 해야한다!!!

Java 설치

## curl 설치
apt update
apt install curl

## 자바 다운로드 (JDK 11에는 더이상 JRE가 포함되지 않는다. 유료화... JDK 8을 받는다.)
cd ~
curl -OL "https://download.oracle.com/otn/java/jdk/8u251-b08/3d5a2bb8f8d4428bbe94aed7ec7ae784/jdk-8u251-linux-x64.tar.gz?AuthParam=1593508166_a0ec4e4730475bcc7e56dcfe303cb284"

## 자바 압축 해제 및 이동
tar zxf jdk-8u251-linux-x64.tar.gz\?AuthParam\=1593508166_a0ec4e4730475bcc7e56dcfe303cb284
mv jdk1.8.0_251 /usr/local
cd /usr/local

## 자바 링크 생성
ln -s ./jdk1.8.0_251 java

## 자바 위치 확인
whereis java

java: /usr/local/java

## 환경변수 설정
cd /root
find .bash*

.bash_history
.bashrc

## vi 에디터로 편집
apt install vim
vi profile

## 환경변수 설정
vi /root/.bashrc

(링크된 경로 기준)
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin/       ## 처음 추가할 때 $PATH 이 기본 경로를 반드시 넣어줘야한다. CLASS_PATH도 마찬가지...
export CALSS_PATH=$CLASS_PATH:$JAVA_HOME/lib

(실제 경로 기준)
export JAVA_HOME=/usr/local/jdk1.8.0_251
export PATH=$PATH:$JAVA_HOME/bin/
export CALSS_PATH=$CLASS_PATH:$JAVA_HOME/lib

둘 중 하나 추가하기

도커 리눅스는 도커가 올라가고 내려갈 때 부팅이 되는게 아니고 중단 되었다 재개되는거라 /etc/profile에 넣으면 환경변수 적용이 안 된다.  따라서 계정이 로그인 될 때 불러올 수 있도록 /root/.bashrc에 환경변수를 설정한다.

또는 Dockerfile을 만들어서 도커 start시 환경변수를 자동 적용되도록 만든다.

## 설정 적용하기
source /root/.bashrc
또는
sudo su - $USER

## 확인하기
javac -version

 

MariaDB 설치

## MariaDB 설치
apt install mariadb-server
mysql_install_db

## MySQL 설정
[client]
default-character-set = utf8
[mysqld]
bind-address=0.0.0.0
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8

## MariaDB 시작
service mysql start
mysql

MariaDB [(none)]>

## User 생성
CREATE USER 'kopo'@'%' IDENTIFIED BY '1234';

## 권한 부여
GRANT all privileges ON *.* TO 'kopo'@'%';

## USER 조회
SELECT USER,HOST FROM mysql.user;

## 권한 설정 바로 적용
FLUSH PRIVILEGES;

## 나가기
exit

## MariaDB 종료
service mysql stop

 

Tomcat 설치 (jdk 설치 이후에 진행)

## Tomcat 설치
cd ~
curl -OL "http://apache.tt.co.kr/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz"
또는
curl -OL "http://mirror.navercorp.com/apache/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz"

## 압축 풀기
tar zxf apache-tomcat-9.0.36.tar.gz

## 톰캣 이동
mv apache-tomcat-9.0.36 /usr/local/

## 톰캣 링크 설정
ln -s ./apache-tomcat-9.0.36 tomcat

만약, tar가 아닌 zip으로 받았을 경우... (왠만하면 tar로 받자...)

## unzip 설치 (왠만하면 zip말고 tar로 받자... tar zxf 는 따로 설치 안 하고 풀린다.)
sudo apt install unzip

## zip 풀기
unzip apache-tomcat-9.0.36.zip
tar zxf apache-tomcat-9.0.36.tar.gz

만약, 인터넷이 되지 않는 환경이라 우분투에서 도커 내 우분투로 파일을 복사해야 하는 경우 docekr cp 명령어를 사용한다.
(단, 이렇게 하기보다 컨테이너를 외부 인터넷이 되는 환경에서 만든 다음 이미지로 만들어 그 이미지를 통째로 가져오는게 더 낫다. 어차피 외부에서 만들어 온 이미지나 여기서 힘들게 만든 이미지나 같으니까...)

## 도커 컨테이너 리눅스 내부로 옮기기(docker cp [파일명] [컨테이너이름][:내부경로]
docker cp apache-tomcat-9.0.36.zip ub:/usr/local

## 도커 리눅스 컨테이너 내부로 접속
docker attach ub

## 환경변수 vi 에디터로 편집
vi /root/.bashrc

export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
export CALSS_PATH=$CLASS_PATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/ext:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
export LC_ALL=C.UTF-8

을 추가한다. PATH랑 CLASS_PATH는 뒤에 : 으로 추가하면 되니까 이렇게 하면 된다.

export JAVA_HOME=/usr/local/java
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$JAVA_HOME/bin/:$CATALINA_HOME/bin
export CALSS_PATH=$CLASS_PATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/ext:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
export LC_ALL=C.UTF-8

## 설정 적용하기
source /root/.bashrc
또는
sudo su - $USER

## 톰캣 실행 (기본 포트 8080)
$CATALINA_HOME/bin/startup.sh

## 톰캣 정지
$CATALINA_HOME/bin/shutdown.sh

 

컨테이너 -> 이미지
(컨테이너가 실행중이라면 정지시키고 진행한다.)

## 도커허브 계정으로 로그인
docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

## 컨테이너 커밋
docker commit [컨테이너이름] [이미지이름][:버전명]
docker commit ub myubuntu:1.0.0

## 컨테이너 태그 (:[버전명] -> 도커에서 이것을 'TAG'라 한다. 하나의 IMAGE ID에 여러개의 태그를 달 수 있다.)
## Usage:  docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]  ## TARGET_IMAGE 이름과 [:TAG] 버전명은 원본과 아무런 연관이 필요 없다.
## Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

docker tag myubuntu:1.0.0 test:2.0.0

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myubuntu            1.0.0               64a7aa9f814b        About an hour ago   1.13GB
test                2.0.0               64a7aa9f814b        About an hour ago   1.13GB
ubuntu              20.04               74435f89ab78        2 weeks ago         73.9MB

## ubuntu:20.04는 도커 허브에서 pull 해서 받은 최초의 이미지다. (docker pull ubuntu:20.04)
## ubuntu:20.04를 ub라는 컨테이너로 만들어 여러 앱을 설치했고, (docker run -d -it --name ub ubuntu:20.04 /bin/bash)
## ub라는 컨테이너를 myubuntu:1.0.0 이라는 이미지로 commit을 해서 생성했다. (docker commit ub myubuntu:1.0.0)
## myubuntu:1.0.0 이라는 이미지를 test:2.0.0 이라는 이미지로 태그를 달아줬다. (docker tag myubuntu:1.0.0 test:2.0.0)
## IMAGE ID를 보면 myubuntu:1.0.0은 이미지를 새로 생성해서 IMAGE ID가 부여되었다는 것을 알 수 있다.
## test:2.0.0은 태그를 달아준 것이기 때문에 myubuntu:1.0.0과 IMAGE ID가 같다는 것을 알 수 있다.
## 이런식으로 태그를 여러개 따면 이미지를 여러개 만들지 않고도 브랜치 따듯 관리를 할 수 있다.

## 도커 허브에 올릴 이미지 생성
## 도커 허브에 올릴 이미지는 규칙이 있다.
## [도커허브ID]/[이미지이름][:TAG] 형식으로 이미지를 만들어야한다.
## ([이미지이름][:TAG] 으로 만들고 push할 때 앞에 '[도커허브ID]/'를 붙이면 '[도커허브ID]/[이미지이름][:TAG]' 전체를 하나의 문자열로 인식해 해당하는 이미지가 없다고 에러가 발생한다.)

docker tag myubuntu:1.0.0 [도커허브ID]/hubtest:2.0.1
docker push [도커허브ID]/hubtest:2.0.1

docker tag myubuntu:1.0.0 apbifnopo/hubtest:2.0.1
docker push apbifnopo/hubtest:2.0.1

도커 서버 구축 v1.0.pdf
0.30MB

 

그 외 키노트에 추가하지 못 한 부분들...

볼륨 마운트 시키기

docker run을 할 때 -v 옵션을 함께 준다.

-v=로컬경로:컨테이너경로

docker volum create [볼륨이름]으로 디렉토리 만든 경우 로컬 경로는 전체 경로 대신 [볼륨이름]만 적어도 된다.

 

Dockerfile(도커파일) : 컨테이너 내부에 넣을 환경변수 포함해서 이미지 빌드하기

도커파일로 설정 포함해 이미지 만들기 (이미지 -> 컨테이너 생성시 실행되는 명령어로 docker run을 쉽게 해준다.)

export JAVA_HOME=/usr/local/java
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$JAVA_HOME/bin/:$CATALINA_HOME/bin
export CALSS_PATH=$CLASS_PATH
                 :$JAVA_HOME/lib/tools.jar
                 :$JAVA_HOME/jre/lib/ext
                 :$CATALINA_HOME/lib/jsp-api.jar
                 :$CATALINA_HOME/lib/servlet-api.jar
export LC_ALL=C.UTF-8
FROM [도커허브ID]/ubuntu:0.1
LABEL maintainer="email"
EXPOSE 8080
EXPOSE 3306
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME /usr/local/java
ENV CATALINA_HOME /usr/local/tomcat
ENV CLASSPATH :/usr/local/java/lib/tools.jar
              :/usr/local/java/jre/lib/ext
              :/usr/local/tomcat/lib/jsp-api.jar
              :/usr/local/tomcat/lib/servlet-api.jar
ENV LC_ALL=C.UTF-8
ADD entry.sh /root/entry.sh
RUN chmod +x /root/entry.sh
ENTRYPOINT /root/entry.sh

근데 entry.sh 말고 환경변수는 굳이 이렇게 할 필요 없이 환경변수를 에디터로 저장해두고 커밋해서 컨테이너에서 이미지로 만들면 되는거 아냐????????

 

도커파일과 같은 경로에 entry.sh 만들기(이미지 -> 컨테이너 생성시 컨테이너 내에서 실행시킬 명령어)

위 Dockerfile의 ADD에 의해 해당 entry.sh이 컨테이너로 만들 때 컨테이너 내부에 추가되고, RUN에 의해 권한을 부여받고, ENTRYPOINT에 의해 실행이된다.

service mysql start
/usr/local/tomcat/bin/startup.sh
/bin/bash

 

최종 이미지 빌드하기

docker build -f Dockerfile -t [*도커허브용이미지이름*] .          // *[도커허브ID]/[이미지이름][:TAG]*
docker build -f Dockerfile -t apbifnopo/hubtest:2.0.1 .

한 칸 띄고 . 반드시 붙인다.

 

도커허브에 올리기(푸쉬)

docker login

docker push [*도커허브용이미지이름*]           // *[도커허브ID]/[이미지이름][:TAG]*
docker push apbifnopo/hubtest:2.0.1

 

나중에 해당 도커 이미지를 실행하려면

docker run -it --name [컨테이너별칭] -p 3306:3306 -p 8080:8080 -v=[로컬디렉토리]:/var/lib/mysql -v=[로컬디렉토리]:/usr/local/tomcat/webapps [이미지이름]   
docker run -it --name ub -p 3376:3306 -p 8780:8080 -v=/volumes/sb portable ssd/docker/apbifnopo/mysql:/var/lib/mysql -v=/volumes/sb portable ssd/docker/apbifnopo/webapps:/usr/local/tomcat/webapps apbifnopo/hubtest:2.0.1

만약 docker volume cteate로 mysql, webapps라는 볼륨을 만들었다면

docker run -it --name [컨테이너별칭] -p 3306:3306 -p 8080:8080 -v=mysql:/var/lib/mysql -v=webapps:/usr/local/tomcat/webapps [이미지이름]

 

2020/06/02 - [개발자/OS(Linux, Docker, VM...)] - Docker 명령어 정리

+ Recent posts