Wordpress 이미지와 MySQL 이미지 연결(Link) 예제

|

Docker 컨테이너간 연결

Docker로 이미지를 생성할 때, 하나의 이미지에 웹 서버, 데이터베이스 등 필요한 프로그램을 모두 설치하는 것도 가능하지만, 보통은 프로그램별로 이미지를 따로 생성하는 경우가 많습니다. 이렇게 이미지를 따로 생성하면 나중에 웹 서버를 교체하거나 데이터베이스를 교체하는 일이 있을 때 각 서버간 충격을 완화시키고 훨씬 더 유연하게 대처할 수 있기 때문입니다.

Docker 컨테이너끼리 연결할 때는 docker run 명령어에 --link 옵션을 사용합니다.


Wordpress 및 MySQL

Docker Hub에는 Wordpress 이미지가 이미 존재합니다. 따라서 해당 이미지를 내려받아서 설치하면 간단하게 Docker 기반 Wordpress 컨테이너를 생성할 수 있습니다. 하지만 Wordpress는 MySQL 데이터베이스를 필요로 합니다. 따라서 MySQL 이미지도 내려받아야 하며, 두 이미지로 생성한 컨테이너간 링크(Link) 설정을 해주어야 합니다.

컨테이너간 링크는 ‘Wordpress’ 컨테이너에서 ‘MySQL’ 컨테이너로 연결을 해줘야 하기 때문에, 여기서는 편의상 MySQL 컨테이너를 먼저 실행하고 그 이후 Wordpress 컨테이너를 실행하도록 하겠습니다.


MySQL 이미지 다운로드 및 컨테이너 실행

$ docker run --name snow-mysql -e MYSQL_ROOT_PASSWORD=snowdeer -d mysql 

MySQL 이미지는 몇 가지 파라메터(특히 ROOT 패스워드)를 설정해줘야 정상적으로 동작합니다. -e 옵션을 이용해서 필수 변수의 값을 세팅해줬습니다. 해당 옵션은 Docker HUB 사이트의 [MySQL 이미지 페이지]((https://hub.docker.com/_/mysql/)에서 확인할 수 있습니다. 만약 파라메터없이 run 명령어로 수행했을 때도, docker logs <container name> 명령어를 통해서 해당 컨테이너가 정상적으로 돌고 있는지, 또는 오류가 발생했는지 확인할 수 있습니다.

-d 옵션은 ‘detach’라는 의미로 백그라운드에서 컨테이너가 돌 수 있도록하는 옵션입니다.


Wordpress 컨테이너 실행 및 링크 설정

$ docker run --name snow-wp --link snow-mysql:mysql -p 80 -d wordpress

위 명령어는 snow-wp라는 이름의 컨테이너를 생성하며, mysql 이미지로 생성된 snow-mysql이라는 이름의 컨테이너에 링크(link) 설정을 합니다. 이 때 링크되는 포트는 80번 포트가 되며 -d 옵션을 통해 백그라운드로 수행됩니다. 마지막의 wordpresssnow-wp 컨테이너를 생성할 이미지 이름입니다.


컨테이너 상태 조회

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
4c74627deef3        wordpress           "docker-entrypoint.s…"   13 minutes ago      Up 13 minutes       0.0.0.0:32768->80/tcp   snow-wp
ef5202166d02        mysql               "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       3306/tcp                snow-mysql

위와 같이 컨테이너 2개가 동작하고 있는 것을 확인할 수 있으며, snow-wp 컨테이너의 포트 정보를 보면 0.0.0.0:32768가 80번 포트로 연결되었음을 확인할 수 있습니다.


웹브라우저에서 Wordpress 확인

위에서 확인한 0.0.0.0:32768 정보로 웹 브라우저에서 접속하면 다음과 같이 Wordpress 설정 화면을 볼 수 있습니다.

Image

ROS 2.0 소스로 설치할 때 중간에 Timeout 오류나는 경우 해결법

|

Timeout 오류 문제 해결법

ROS 2.0 설치를 소스로 다운받아서 빌드하는 경우, 중간에 소스를 다운받다가 Timeout이 나는 경우가 종종 있습니다.

예를 들면, rviz_ogre_vendor라는 패키지를 600초 안에 다운 받아야 하는데, 만약 다운 속도가 느려서 600초가 넘어가면 다운로드 실패가 되며 다시 처음부터 다운받아야하는 불상사가 생기는 경우가 있습니다. 응답 없음에 대한 Timeout이 아니라, 전체 다운로드하는데 걸리는 시간이 600초 이하라야 하더군요.

해결법은 다음과 같습니다.

/ros2_ws/src/ros2/rviz/rviz_ogre_vendor 폴더를 찾아갑니다. rviz_ogre_vendor 패키지가 아닌 다른 패키지에서 문제가 발생하면 해당 패키지 폴더를 찾아가면 됩니다. 해당 폴더에서 CMakeList.txt 파일을 열면 그 안에 다운로드 경로와 Timeout 설정값이 있습니다. Timeout 값을 20~30배로 늘려주면 됩니다.

신경망(Neural Network)

|

Neural Network

퍼셉트론을 이용하면 복잡하고 어려운 함수도 표현이 가능합니다. 하지만, 가중치를 설정하는 작업을 사람이 수동으로 해줘야하는 불편함이 여전히 존재합니다.

신경망(Neural Network)은 이러한 문제점을 해결해줍니다. 가중치를 학습을 통해서 자동으로 획득하고 수정할 수 있습니다.


Simple Neural Network

신경망을 간단하게 그림으로 표현하면 다음과 같습니다.

Image

데이터가 입력되는 쪽을 Input, 결과값이 출력되는 쪽을 Output, 그리고 그 사이를 Hidden이라고 합니다. 층이 많아지면 아래의 그림과 같은 모습이 됩니다.

Image


퍼셉트론과 신경망

신경망은 퍼셉트론과 크게 다르지 않습니다. 퍼셉트론은 다음과 같은 함수로 이루어져 있습니다.

[output = \begin{cases} 0 ( w_1 x_1 + w2 x_2 + … + w_i x_i \le 0 )
1 ( w_1 x_1 + w2 x_2 + … + w_i x_i > 0 ) \end{cases}]

이걸 좀 더 간결하게 표현하면 다음과 같이 표현할 수 있습니다.

[y = h(b + w_1 x_1 + w_2 + x_2 + … w_i x_i)
h(x) = \begin{cases} 0 ( x \le 0 )
1 ( x > 0 ) \end{cases}]

입력 신호의 총합이 h(x)라는 함수를 거쳐서 변환이 되며, 그 변환된 값이 y 출력값이 됩니다.


Activation Function

위에서 나온 h(x) 함수는 활성화 함수(Activation Function)라고 합니다. 입력 신호의 총합을 출력 신호로 변환해주는 함수입니다.

위의 수식에서 $ b + w_1 x_1 + w_2 + x_2 + … w_i x_i $ 부분을 a라는 변수로 치환하면 다음과 같은 식으로 표현이 됩니다.

[a = b + w_1 x_1 + w_2 + x_2 + … w_i x_i
y = h(a)]

그림으로 표현하면 아래와 같은 그림이 되고,

Image

조금 더 간결하게 표현하면 다음과 같이 표현됩니다.

Image

컨테이너 실행 명령어

|

Docker Container

Docker 컨테이너는 Docker 이미지로부터 생성할 수 있습니다. 이미지 하나로부터 동일한 컨테이너를 여러개 생성할 수 있으며, 각 컨테이너는 샌드박스(Sandbox) 형태로 되어 있어 각 컨테이너간 간섭이 없습니다.


컨테이너 생성

docker run <image name> 명령어를 이용해서 컨테이너를 생성할 수 있습니다. run 명령어로 실행한 컨테이너는 주어진 명령이 끝나거나 사용자 명령에 따라 종료됩니다.

예를 들어 다음과 같이 명령을 내리면

$ docker run ubuntu echo "hello"

hello

화면에 ‘hello’라는 메시지만 출력하고 해당 컨테이너는 종료됩니다. 해당 컨테이너의 상태 여부는 docker ps -a 명령어를 이용해서 조회 가능합니다.

docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                     PORTS               NAMES
303c05fe9c03        ubuntu                  "echo hello"             4 seconds ago       Exited (0) 3 seconds ago                       dreamy_goldstine

STATUSExited 상태인 걸 확인할 수 있습니다.


컨테이너 목록 조회

컨테이너 목록은 docker ps 명령어를 이용해서 조회할 수 있습니다. 여기에 -a 옵션을 붙이면 종료된 컨테이너 정보까지 조회됩니다.

$ docker ps -a


컨테이너 시작/재시작/정지

다음 명령어로 컨테이너를 시작하거나 재시작, 정지할 수 있습니다.

$ docker start <container name>

$ docker restart <container name>

$ docker stop <container name>


현재 실행중인 컨테이너에 접속하기

docker attach 명령어로 현재 실행중인 컨테이너에 접속할 수 있습니다.

$ docker attach <container name>


외부에서 컨테이너 안의 명령 실행하기

docker exec 명령어로 컨테이너 밖에서 컨테이너 안의 명령을 실행할 수 있습니다.

$ docker exec <container name> <command>

ex) docker exec snowdeer_docker echo "Hello, SnowDeer"

exec 명령어는 현재 실행 중인 컨테이너에만 사용할 수 있으며, 중지 상태의 컨테이너에는 사용할 수 없습니다.


컨테이너 삭제

docker rm 명령어로 컨테이너 삭제를 할 수 있습니다. 컨테이너 삭제는 rm 명령어이며, 이미지 삭제는 rmi 입니다.

$ docker rm snowdeer_docker

docker run 명령을 이용해서 컨테이너를 실행할 때 --rm 옵션을 붙이면 컨테이너 종료시 해당 컨테이너가 자동으로 삭제되기 때문에 편리하게 연습용으로 편리하게 사용할 수 있습니다.

Docker Hub로부터 이미지 검색 및 다운로드

|

Docker Hub

Docker Hub에는 10만개가 넘는 Docker 이미지들이 존재합니다. 직접 Docker Hub 홈페이지를 방문해도 되고 터미널에서 커맨드 명령어로 원하는 이미지를 검색하거나 다운로드할 수 있습니다.

여기서는 터미널에서 커맨드 명렁어로 이미지를 검색하고 다운로드하는 방법을 포스팅합니다.


이미지 검색

Docker 이미지는 다음 명령어를 이용해서 검색할 수 있습니다.

$ docker search <image name>

ex) docker search ubuntu


이미지 다운로드

pull 명령어를 이용해서 원하는 이미지를 다운로드할 수 있습니다. 이미지 이름 뒤의 <tag>를 이용하여 원하는 버전의 이미지를 다운로드할 수 있으며, 생략할 경우 기본값으로 latest 태그가 입력됩니다.

$ docker pull <image name>:<tag>

ex) docker pull ubuntu

또는 run 명령어를 이용해서 원하는 이미지를 다운로드하면서 해당 이미지의 컨테이너를 실행할 수 있습니다. run 명령어는 로컬에 이미지가 있을 경우 해당 이미지로부터 컨테이너를 생성하며, 로컬에 이미지가 없을 경우 이미지를 다운로드합니다.

$ docker run -i -t --name <container name> <image name>

ex) docker run -i -t --name hello ubuntu


이미지 리스트 조회

docker images 명령어를 이용해서 로컬에 설치된 이미지 리스트를 확인할 수 있습니다.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              0458a4468cbc        10 days ago         112MB
hello-world         latest              f2a91732366c        2 months ago        1.85kB


이미지 삭제

이미지 삭제는 rmi 명령어를 이용합니다.

$ docker rmi <image name>:<tag>

ex) docker rmi ubuntu:latest