지금까지 기존에 있던 이미지 그 중에서 우분투 이미지를 받아 그 위에 nginx설치를 하고 mysql 설치를하여 서버셋팅을 하였다. 하지만 매번 서버셋팅을 하는건 매우 귀찮고 번거로운 작업이다. 내 서버환경을 이미지로 직접 만들어 둔다면 매우 편할 것이다. 이번 포스팅에는 그 방법을 알아본다.

 

Dockerfile

 베이스가 되는 이미지에 추가적인 미들웨어나 어플리케이션을 설치하여 배포할 수 있게 해주는 파일이다. 파일명은 확장자 없이 Dockerfile이여야 하며 스크립트 처럼 한줄 한줄 위에서 부터 아래로 실행되는 구조이다. 명령어는 대문자로 사용한다.

 

 

 

Dockerfile 명령어

명령어 설명
FROM 생성할 이미지의 베이스가  이미지.
MAINTAINER 이미지를 생성한 개발자의 정보. 일반적으로 메일 정보를 작성
RUN 이미지 상의 리눅스 커맨드를 실행하도록 해주는 명령어
WORKDIR 명령어를 실행할 디렉토리 지정
EXPOSE 생성된 이미지와 호스트간 연결할 포트번호
CMD 도커 컨테이너가 시작할 때마다 실행할 명령어 설정

 오늘 사용할 명령어만 간단히 정리 하였다. 명령어는 위 이외에도 많으며 CMD와 ENTRYPOINT등 비슷하지만 조금씩 다른 헷갈리는 명령어가 있으므로 따로 정리하여 포스팅하기로 한다.

 

 

 

Dockerfile 작성

 vim Dockerfile 명령어로 에디터를 열어 아래와 같이 작성해 주었다.

우분투 이미지를 베이스로 사용하며 update와 nginx, nano를 설치 해주고 nginx실행까지 하는

이미지를 만드는 Dockerfile이다.

해당 도커파일로 만들어진 이미지로 컨테이너를 생성하면 호스트 pc에서 바로 nginx접속이 가능할 것이다.

 

 

 

이미지 생성

 작성한 Dockerfile을 이용해 이미지를 생성한다

$docker build --tag mydocker:0.1 ./

tag 옵션은 빌드할 이미지 이름을 지정하는 옵션이며 뒤에 '이름:버전'을 인자로 받는다.

뒤에 ./은 Dockerfile에 위치를 넣어준다.

Step이 다 실행되고 Successfully를 확인

 

docker images명령어로 확인해보니 이미지가 잘 생성됨을 알 수 있다.

 

 

 

 

만들어진 이미지 확인

이미지가 잘 만들어 졌는지 확인을 해보자. 이미지로 컨테이너 생성만 하면 nginx웹서버에 접속이 가능해야 한다.

 

컨테이너 생성.

 

확인.

 

nginx접속 확인. 

실제 서버 배포를 위해 디테일한 셋팅까지 해놓은 이미지를 만들어 두면 굉장히 유용할 것 같다.

 

 

 

 

Docker hub에 배포하기

 우선 도커계정이 필요하다. 없는 사람은 가입이 필요. 회원가입을 하면 나의 repository가 생긴다. 여기에 배포를 해보자.

 

가입 후 도커 커널에서 로그인

매우 간 - 단

 

$docker push [이미지명]

명령어로 간단히 배포를 할 수있다. 

단. 도커 로그인계정에 권한이 있는 레포지토리에만 push가 가능하다. 이미지명이 레포지토리 경로까지 포함되는거 같으므로 아래와 같이 이미지명을 xzxz1002/mydocker로 바꾸어 다시 만들었다.

내 계정으로 도커hub에 접속해보니 잘 push됨을 확인할 수 있다.

 

1. docker run -it --name [컨테이너이름] -p 80:80 debian:buster

buster는 데비안 버전이며 nginx기본포트가 80이므로 컨테이너 포트도 80으로 잡아주었다.

 

 

2. apt-get install nginx

nginx 설치 후 

service start를 해주자.

잘 실행 중이라면 웹브라우저에서 localhost로 접속하였을 때 기본 index페이지가 나와야 한다. 

 

 

3. apt-get install php7.3 php-mysql php-fpm php-cli php-mbstring php-curl php-gd

php와 추후에 사용할 각종 관련 패키지까지 한번에 설치

7.3버전을 받았다.

 

 

4. 환경 설정

nginx쪽과 php 둘다 환경설정을 해주어야 한다.

/etc/nginx와 /etc/php폴더안에 있는 환경설정 파일을 수정할 예정

 

 

4.1 nginx 환경설정

/etc/nginx/sites-available 경로에 default파일을 들어가서

아래와 같이 주석 되어진 부분을 주석만 풀어준다.

수정 전
수정 후

 

4.2 php 환경설정

/etc/php/7.3/cli 경로와 /etc/php/7.3/fpm 경로에 둘다 php.ini파일이 있는데 동일하게 수정하면 된다.

Off를 -> On으로
1을 -> 0으로

cli폴더 안에 php.ini도 위와 동일하게 수정.

 

 

5. nginx와 php 재시작

service nginx restart

service php7.3-fpm start

service php7.3-fpm restart

nginx는 이미 돌아가는 중이니 restart해주고 php는 처음이니 start후 다시 한번 더 재시작 해준다.

 

아까 주석을 풀어 설정해준 파일이 생성된걸 확인할 수 있다.

 

 

6. 파일 생성 후 확인

/etc/nginx/sites-available 경로에 default파일에 보면 root경로가 있다.

아래 41번줄 경로안에 php파일을 만들면 nginx웹서버로 php파일을 읽어 접속할 수 있다.

/var/www/html/test.php

test.php파일을 만들고

localhost/test.php로 접속하여 확인

hello world!

과제업로드를 하는김에 평소 궁금했던 docker 컨테이너 port설정에 대해 알아보았다.

 

우분투 연습과제2 : nano에디터 설치후 파일 생성해서 에디팅 작업 해보기.

 

1. apt-get install nano

나노 다운

나노 기본 명령어

실행

nano

파일 열기

nano 파일명

저장

Ctrl+O

끝내기

Ctrl+X, 정말로 끝낼 것인지를 묻는 화면에서 Y를 누르고 저장하려는 파일명을 확인한 후에 엔터

자르기와 붙이기

한줄 자르기 : Ctrl+k

붙이기 : Ctrl+u

여러줄 자르기 : Ctrl+^ 를 누르고 화살표로 블럭을 설정한 후에 Ctrl+k

찾기

Ctrl+w

 

써보니 vi처럼 명령어모드, 입력모드가 없고

윈도우에서 메모장을 키보드로만 다루는 것 처럼? 쓸 수 있었다.

 

 

도커 연습과제 : nginx컨테이너 설치

 

1. docker run --name con_nginx -d -p 8080:80 nginx

웹서버인 nginx를 백그라운드로 돌리려고 -d 옵션을 주고

포트는 8080:80으로 주었다.

docker ps -a 명령어로 실행중인 것을 확인

 

 

톰캣 고양이같은 화면이 뜨길 바라며 localhost:8080 으로 접속.

그러나 사이트에 연결할 수 없음이 뜬다. 

이유는 내 pc와 vm간에 포트포워딩이 안 되어 있었기 때문이다. 

구구절절 설명하기보다 그림으로 나타내는 것이 이해하기 쉬울거 같아 만들어 보았다.

 

2. oracle VM 포트포워딩

 

이제 진짜 host PC와 VM을 연결해주면 된다.

virtualBox.exe를 실행

내 컴퓨터에는 C:\Program Files\Oracle\VirtualBox 경로에 있었다.

 

 

그림과 같이 포트 포워딩을 해주었다

여기서 7070 포트를 VM에 8080포트로 연결해 주었다.

아래와 같은 흐름으로 nginx 웹서버에 접속!

 

잘 접속된걸 확인할 수 있다.

+디렉토리는 root계정으로 다 만들고 파일만 유저계정으로 바꿔서 만들라는 전제조건이 있음.

 

 

1. 사용자 계정 만들기

 

명령어 : adduser 사용자명

 

비밀번호 설정하고 추가정보 묻는데 그냥 엔터로 다패스

 

2. 4개 디렉토리 생성

그림을보니 home디렉토리속에 유저폴더 안에 만들어야 할 것 같다.

 

명령어 :

mkdir /home/guest/{document,download,workspace,bin} -> 디렉토리 4개 생성

중괄호로 묶어  원하는 경로 밑에 한번에 만들어 주었다

3. Workspace 디렉토리아래 hello.txt 파일을 만든다 ( 사용자 계정으로 만드셔서 파일 권한이 사용자가 되도록 파일을 생성하세요 )

 

아까 만든 사용자 계정으로 바꿔 파일을 만들자

 

명령어 :

su guest -> 사용자 변경

cd ~/workspace -> 해당 디렉토리로 이동

touch Hello.txt -> 파일만듬

 

쉽게 과제가 끝나는듯 하였으나

root계정으로 만든 디렉토리였기에 다른사용자의 쓰기권한이 없어 파일을 만들 수 없었다.

sudo 명령어로 처리하려 했으나 해당 사용자가 sudo명령어를 사용할 권한조차 없어 사용불가

 

4. 아까 만든 사용자에게 sudo권한 부여

 

명령어 :

su root -> 일단 다시 root권한으로

usermod -aG sudo guest -> 계정수정하는 명령어인 usermod에 -aG 아마 add group일거 같은 옵션으로 sudo 그룹에 포함시킨다.

 

5. 다시 파일 생성하기

 

명령어 : sudo touch Hello.txt

생성 

그런데 "파일 권한이 사용자가 되도록 파일을 생성" 이부분이 거슬린다. 소유자를 사용자로 하라는건가..

sudo chown guest:guest Hello.txt로 소유자변경

 

 

지난번 포스팅에 도커에서 처음으로 이미지를 받고 컨테이너를 생성하고 실행해 보았다.

이번에는 MySQL을 받아 실행해볼 것이다.

 

$ docker run -it --name con_mysql -p 33006:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

run으로 한번에 해버린다.

 

위에 나온 옵션 설명은 저번 포스팅에도 했지만

-p와 -e는 처음 사용한다. 자세히 보면

 

-p 에 : 앞 포트는 Host PC의 포트이며 : 뒤 포트는 컨테이너의 포트이다. 잘 와닿지 않는데 사례로 풀어 설명하면

외부 또는 다른 컨테이너에서 MySQL에 접속하기 위해서는 3306포트가아니라 33006포트로 접속해야 한다는 것이다.

 

-e는 환경변수 옵션으로 MYSQL_ROOT_PASSWORD로 MySQL root계정 비밀번호를 설정했다.

 

이미지가 없으니 이미지 먼저 다운받고 순조롭게 되는듯 했으나..

 

 

ubuntu에 접속했을때 처럼 프롬포트가 쉘처럼 바뀔줄 알았는데 MySQL 로그가 찍히고 있다..

알아보니 exec 명령어를 통해 MySQL은 접속해야한다고 한다.

$docker exec -it con_mysql /bin/bash 이렇게 말이다

 

 

run명령어는 create, start, attach 명령어를 한번에 수행하는데

여기서 attach와 exec는 그럼 무슨차이가 있을까??

 

우선 attach는 현재 실행중인 컨테이너에 접속하는것이다. 도커에서 컨테이너는 프로세스 개념으로 run이나 start로 컨테이너가 실행되면 /bin/bash를 실행하는 이미지도 있어서 attach로 붙어도 바로 쉘 프롬포트가 나오는 경우가 있지만 그렇지 않은 이미지도 있기에 위와같은 결과가 나왔다.
실행시 바로 bash를 실행하지 않는 이미지에서 run명령어시 인자로 /bin/bash를 주면 attach로 쉘 프롬포트 접속 가능하다.

 

반면 exec는 현재 실행중인 컨테이너에 특정 쉘스크립트를 실행하는 것이다. 그래서 위에 exec명령어로 mysql에 접속하면 해당 컨테이너에 bash shell을 실행시켜 쉘 프롬포트가 화면에 나오게 된다.

 

또한 attach로 바로 쉘 프롬포트에 접속하게되면 /bin/bash로 실행된 1번 PID에 접속하게 되는 것이고 그러므로 해당 콘솔에서 exit하게 되는경우 그 컨테이너는 중지된다. 

 

attach로 붙은후 해당 쉘을 나가니 컨테이너가 중지되어있다.

그러나 exec /bin/bash로 컨테이너에 접속하는 경우 기존에 열려있던 PID1에 물리는 것이 아닌 별도의 프로세스를 생성하여 bash 를 실행한다. 따라서 해당 쉘 프롬포트에서 exit하게되도 그 컨테이너는 중지되지 않고 유지된다.

반면 exec로 붙은경우 bash프로세스가 하나더 생김을 볼 수 있고 exit로 나가도 여전히 컨테이너가 Up상태임을 알 수 있다.

 

 

드디어 정상적인 MySQL 실행

 

여담이 길었는데 별거없다. 저번 포스팅이랑 다운, 실행 방법이 모두 같다.

백그라운드에서 돌리기 위해 -d옵션을 주었고 이번 테스트후 컨테이너를 바로 삭제하기위해 --rm을 주었다.

 

이후엔 그냥 MySQL과 같은듯하다.

 

 

참고 :

https://zgundam.tistory.com/132

https://waspro.tistory.com/536

https://github.com/luckymagic7/Base/wiki/Docker-attach-VS-exec

지난번 포스팅에서 윈도우 환경에서 도커 설치하는 법을 알아보았다.

이번 포스팅에는 도커에 우분투 이미지를 설치하면서 같이 관련 도커 명령어를 알아볼 것이다.

 

 

도커 Image 검색하기

$ docker search [옵션] <검색어>

 먼저 이미지 설치 전에 어떤 이미지들이 있는지 궁금하기도 하고 이미지에 완전한 이름도 모를수도 있으니 검색을 통해 알아보자.

 

ubu로만 검색해도 우분투 관련 이미지들이 쭈욱 나온다.

 

명령어 옆 --help를 명령어에 대한 설명과 옵션값, 옵션설명을 볼 수 있으니 참고하면 되겠다. default로 limit이 25라 ubu검색결과가 25건 나왔었다. 맨위에 stars가 가장 높은데 이는 docker hub 사용자가 해당 이미지를 즐겨찾기 해놓은 것이다. 

 

 

도커 Image 다운

$ docker pull [옵션] [경로]<이미지명>[:태그명]

경로를 생략시 docker hub에 있는 이미지를 받고 태그를 생략시 가장 최신 버전을 받는다. (:latest)

 

검색시 나오던 가장 위에 ubuntu를 받았고 경로, 태그를 생략해서 docker hub에있는 가장 최신버전을 다운 받았다.

 

docker images 명령어로 다운받은 이미지 확인! 잘 받아졌다.

 

 

도커 이미지로 컨테이너 생성

$ docker create [옵션] <이미지명> [명령어] [인자..]

주로 --name 옵션을 많이 사용하는듯하다. 컨테이너 이름을 지정해주는 옵션이다. --name옵션을 지정해주지 않으면 도커가 알아서 이름을 지정해준다. 직접 해보니 매번 다른이름으로 생성된다. (..직박구리 같은건가..)

 

con_ubuntu라는 이름으로 우툰투이미지로 컨테이너를 만들었다.

바로 docker ps -a 명령어로 만들어진 컨테이너 확인. STATUS가 Created이다.

 

 

생성된 컨테이너 실행

$ docker start [옵션] <컨테이너명> [컨테이너명2...]

 

바로 방금 만든 컨테이너를 시작하고 ps -a로 확인해 보았는데 아니 바로 STATUS값이 꺼졌다고 표시중이다..

알아보니 컨테이너를 create할때 -it 옵션을 안주어서 그랬다. 나는 처음에 -it옵션이 쉘에 접속할때나 쓰는건줄 알았는데 아닌가 보다.

 

여기서 컨테이너 관련 자주쓰이는 옵션들을 알아보고 가자.

-d detached mode 흔히 말하는 백그라운드, 데몬 모드
-p 호스트PC와 컨테이너의 포트를 연결 (포워딩)
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
-i 상호 입출력
–t tty를 활성화하여 bash 쉘을 사용

 

컨테이너를 지우고 -it옵션을 추가하여 다시 만들어 start하고 확인해보니 STATUS가 Up상태로 잘 바뀌었다.

 

 

컨테이너 접속

$ docker attach [옵션] <컨테이너명>

실행중인 컨테이너만 접속이 가능하다. 

 

기본적인 리눅스 명령어를 쳐보았다. 잘 나온다.

 

이렇게 이미지를 찾고, 받고 컨테이너를 만들고 실행하고 접속하고를 알아보았다.

이미지를 찾고 다운받는건 매번 필요하지 않겠지만 컨테이너를 만들고 실행하고 접속하고는 꽤 자주 할거같은데 명령어가 나누어져 있다보니 귀찮다.

역시 한번에하는 명령어가 있다.

 

pull ~ create ~ start ~ attach를 한번에

$ docker run [옵션] <이미지명> [명령어] [인자...]

해당 이미지가 없으면 다운받고 없으면 있는 이미지로 컨테이너를 만들어 실행까지 시킨다.

$ docker run -it --name con_ubuntu ubuntu 한줄이면 위에 attach하여 쉘에 접속한거까지 한번에 된다.

 

 

참고 :

https://0902.tistory.com/4

https://nicewoong.github.io/development/2017/10/09/basic-usage-for-docker/

https://www.leafcats.com/190

도커란?

리눅스 컨테이너 기술을 기반으로 하여 특정한 서비스를 서버로 배포하는 기능을 간편하게 할 수 있는 프로그램이다.

사실 도커를 이해하기 위해 기존의 서버환경 셋팅 방법, 기존의 가상머신 기술, 컨테이너 기술 또 Docker Image와 레이어 저장방식등 공부하고 이해할 내용이 많으나 추후 따로 포스팅 하기로 한다.

 

Windows에서 Docker를 사용하는 두가지 방법

 

Windows 환경에서 도커를 사용하려면 Docker tool box를 이용하거나 Docker for Windows를 설치해 사용해야한다. 이 둘의 차이는 운영체제가 자체 가상화를 지원하여 가상화를 이용하는 것과 가상화를 지원하지 않아 Virtual Box를 이용한 가상화를 통해 도커를 설치하는 것의 차이가 있다. 결국 내부적으로는 이 둘 모두 동일한 도커 엔진으로 동작한다고 한다. 자세한 내용과 이해는 더 공부가 필요하다. 이 포스팅엔 tool box를 이용해 설치하는 법을 알아본다.

참고 :  https://dololak.tistory.com/355

 

[Docker] Docker Toolbox(도커 툴박스) 와 Docker for Windows의 차이점

Docker Toolbox(도커 툴박스) 와 Docker for Windows의 차이점 Windows 환경에 도커를 설치하는 경우에는 도커 툴박스를 이용하거나 Docker for Windows를 설치해 사용합니다. 이 둘의 차이는 운영체제가 자체 가.

dololak.tistory.com

 

DockerToolbox.exe 다운로드

 

https://github.com/docker/toolbox/releases 이곳에서 toolbox.exe 파일을 다운받는다.

 

 

다운 받은 파일을 실행!

 

 

 

 

 

 

데이터 수집 유무 체크박스가 보이는데 기호대로 체크하자.

다운받은 설치 파일을 실행하면 위와 같은 화면이 나온다. Next 클릭

 

경로설정

경로를 설정하고 Next 클릭. 모르면 그냥 기본 경로로 넣으면 된다.

 

드디어 뭔가 어려워 보이는게 등장

설치 항목들을 선택하는 화면이 나온다. 위에부터 간단히 설명하면

- 도커 엔진이 이미지 및 컨테이너를 생성할 수 있도록 해주는 도커 클라이언트(Docker Client)
- 윈도우 터미널에서 사용하는 도커 엔진 명령어를 이용하게 해주는 도커 머신(Docker Machine)

- 여러개의 도커 컨테이너의 정의를 작성하여 한번에 많은 컨테이너들을 작동하고 관리하는 도커 컴포즈(Docker Compose)

- 리눅스 기반에서 돌아가는 도커를 윈도우에서 가능하게 만드는 오라클 VM VirtualBox

- 도커 GUI 도구인 카이트메틱(Kitematic)

- 추후 도커 이미지 생성을 위한 각종 파일들을 관리해주는 윈도우용 깃(Git)

 

깃은 이미 설치되어 있으면 체크 해제하고, 아니면 모두 체크하고 Next 클릭

 

기본적인 환경설정 요소

Next 클릭. 다음 화면에 Install 클릭

 

설치끝

Finish 클릭으로 설치 마무리

 

퀵스타트 터미널을 실행시켜준다.

 

첫 실행시 나오는 화면

처음으로 퀵스타트 터미널을 실행하면 다음과 같이 설치를 한다.

기다리면 드디어 고래를 볼 수있다.

 

드디어 만난 고래

도커 설치가  완료되었다.

 

 

도커 기본 명령어

 

버전확인

docker --version : 설치된 도커의 버전확인

docker images : 현재 도커에 존재하는 이미지 목록 출력

docker ps -a : 현재 도커에 존재하는 컨테이너 목록 출력

 

 

docker run hello-world : 도커에서 헬로우 월드(Hello World)를 띄우는 명령어이다. 다음의 과정이 진행된다.

 

1) hello-world라는 이미지를 검색한다.

2) 로컬에 이미지가 있으면 쓰고, 없으면 도커 허브(Docker Hub)에서 내려받는다.

3) 해당 이미지를 컨테이너로 동작시킨다.

 

 

 

참고 :

https://ndb796.tistory.com/91

https://webcoding.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

https://dololak.tistory.com/355

https://medium.com/withj-kr/docker-%EB%B6%80%ED%84%B0-kubernetes-%EA%B9%8C%EC%A7%80-5-docker-compose-%EC%9E%85%EB%AC%B8-ece1a6721775

 

프로젝트중 네임앵커기능을 달아야 했다.

 

 

<div id="top"></div>

<a href="#top">이동</a>

 

 

위 코드처럼 a태그를 클릭하면 해당 #뒤에 id값 태그로 이동하는 간단한것 이었기에 금방 하겠구나 생각했는데
동작을 하지않았다.

 

해당 프로젝트가 AngularJS를 사용중이었는데 분명 이녀석 때문일거라 생각하고
바로 구글링

 

다음과 같은 결과를 얻었다

https://docs.angularjs.org/api/ng/service/$anchorScroll

 

AngularJS

Loading … There was an error loading this resource. Please try again later.

docs.angularjs.org

 

짧게 정리 해보자면

 

 

<a href="javascript:;" ng-click="clickScroll(이동할 태그 id명)">이동</a>

 

$scope.clickScroll = function(id) {
     $location.hash(id);
     $anchorScroll();
};

$location 과 $anchorScroll만 주입시켜 이용하면 끝

실행중인 프로세스를 종료시키기 위해

컨트롤 C, 컨트롤 Z 두개를 구분없이 사용해왔다.

 

차이점을 알아보니 명확한 차이가 있었다.

 

Ctrl + z : 프로세스 정지

 

Ctrl + c : 프로세스 종료

 

나는 종료시키는걸 원했으므로 컨트롤 C를 사용하면 되겠다.

 

1. 헤더에 추가

<script src="경로/angular-sanitize.js"></script>

 

2. 변환

$scope.변수 = $sce.trustAsHtml(HTML이 포함된 텍스트);

 

3. 적용

<p ng-bind-html="변수"></p>

 

 

출처

http://naminsik.com/blog/3136

+ Recent posts