DEV ℧ Developer Diary

[Docker] 도커 기본 명령어 (1) - run, exec

해당 포스트는 inflearn에서 subicura님의 초보를 위한 도커 안내서의 강의를 듣고 정리한 문서입니다.

도커 기본 명령어 (1)

run - 컨테이너 실행

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

[OPTIONS]

옵션 description
-d detached mode (백그라운드 모드)
-p 호스트와 컨테이너의 포트를 연결
-v 호스트와 컨테이너의 디렉토리를 연결
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–network 네트워크 연결

run 실습

run 명령어를 통해 몇가지 컨테이너를 실행 시켜 보도록 하자.

ubuntu 실행

ubuntu의 이미지를 다운받지 않았기 때문에, 다운로드 받고나서 해당 컨테이너를 실행한다.

PS C:\Users\dhaud> docker run ubuntu:20.04

Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
846c0b181fff: Pull complete
Digest: sha256:0e0402cd13f68137edb0266e1d2c682f217814420f2d43d300ed8f65479b14fb
Status: Downloaded newer image for ubuntu:20.04

Docker desktop을 보면 우분투의 컨테이너가 실행된것을 확인 할 수 있다.

docker1

위의 명령어를 입력했을때 우분투가 바로 죽는 이유는 별다른 명령어를 입력하지 않았기 때문이다.

이제 옵션 및 명령어를 추가하여 입력해보자.

아래의 명령어에 몇가지 옵션을 추가하면 우분투가 실행된 것을 확인할 수 있고, 우분투의 명령어가 먹히는것을 볼수 있다.

PS C:\Users\dhaud> docker run --rm -it ubuntu:20.04 /bin/sh
#
# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# cat /etc/issue
Ubuntu 20.04.5 LTS \n \l

# exit 를 통해 ubuntu를 종료할 시 --rm의 옵션으로 컨테이너가 삭제 된다. 만약 해당 옵션을 주지 않을시 수동으로 종료해줘야 한다.

HTML 호출

이제 좀더 재미있는 실습을 해보자.

hashicorp/http-echo 라는 라이브러리를 이용해 간단한 웹서버를 띄우고 해당 페이지를 호출해볼 것이다.

hashicorp/http-echo : 간단한 HTML 페이지 콘텐츠를 만드는 라이브러리

5678의 포트를 가지고 hello world를 반환하는 간단한 웹페이지를 만들었다.

docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world"

아래의 이미지를 다운로드 받는 과정을 거쳐 서버를 띄우는 로그가 확인 된다.

Unable to find image 'hashicorp/http-echo:latest' locally
latest: Pulling from hashicorp/http-echo
86399148984b: Pull complete
Digest: sha256:ba27d460cd1f22a1a4331bdf74f4fccbc025552357e8a3249c40ae216275de96
Status: Downloaded newer image for hashicorp/http-echo:latest
2023/01/23 07:07:54 Server is listening on :5678

이제 또하나의 cmd를 시작해서 curl 명령어로 해당 웹페이지를 호출해보자.

아래 hello world의 컨텐츠를 반환한는 것을 확인 할 수 있다.

PS C:\Users\dhaud> curl http://localhost:5678

StatusCode        : 200
StatusDescription : OK
Content           : hello world

RawContent        : HTTP/1.1 200 OK
                    X-App-Name: http-echo
                    X-App-Version: 0.2.3
                    Content-Length: 12
                    Content-Type: text/plain; charset=utf-8
                    Date: Mon, 23 Jan 2023 07:09:40 GMT

                    hello world

Forms             : {}
Headers           : {[X-App-Name, http-echo], [X-App-Version, 0.2.3], [Content-Length, 12], [Content-Type, text/plain;
                    charset=utf-8]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 12

Redis 실행

Docker 을 이용해 redis나 mysql과 같은 DB의 컨테이너를 실행 시킬 수 있다.

먼저 Redis를 실행시켜 보도록 하자.

몇가지 설정을 거쳐 redis의 서버가 실행된다.

docker run --rm -p 1234:6379 redis

이제 powershell을 하나 더실행시켜서 redis의 client로 접속해보자.

telnet localhost 1234

redis의 명령어 set을 이용해 hello 라는 key 값으로 world 의 value 값을 저장해볼것이다.

이후 get을 통해 값을 정상적으로 호출하는지 확인해보자.

set hello world
+OK
get hello
$5
world

exec - 컨테이너 접속

exec 명령어는 run 명령어와 달리 실행중인 도커 컨테이너에 접속할 때 사용하며 컨테이너 안에 ssh server 등을 설치하지 않고 exec 명령어로 접속한다.

위와같은 방법을 보안과 같은 이유로 도커측에서 권장하고 있다.

exec 실습

이제 run과 exec을 이용해 아래의 실습을 진행해 보자.

MySql + WordPress 실행하기.

MySql과 WordPress를 각각 도커의 컨테이너로 실행해서 블로그를 만들어 보자.

아래의 명령어를 통해 mysql의 컨테이너를 실행시킨다. -d 옵션을 추가하여 백그라운드로 실행시키고, --name 옵션으로 해당 컨테이너의 이름을 mysql로 지정한다.

docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

mysql의 컨테이너를 확인 할 수 있다.

docker1

exec 명령어를 이용해 현재 백그라운드에서 돌아가고 있는 mysql의 컨테이너에 접속하고 데이터베이스에 대한 설정을 추가해주자.

docker exec -it mysql mysql
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit

MariaDB 내부에 wp 라는 데이터베이스를 생성했다.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wp                 |
+--------------------+
5 rows in set (0.000 sec)

이제 워드프레스 블로그를 실행시켜주자. -e 옵션을 이용해 워드프레스 내부에 mysql 설정을 환경변수로 넣어준다.

docker run -d -p 8080:80 \
 -e WORDPRESS_DB_HOST=host.docker.internal \
 -e WORDPRESS_DB_NAME=wp \
 -e WORDPRESS_DB_USER=wp \
 -e WORDPRESS_DB_PASSWORD=wp \
 wordpress

host.docker.internal : docker 환경의 localhost로 접속하는 DNS 주소이다.

만약 DB가 연동이 되어있지 않다면 아래와 같이 나온다.

docker1

이 경우에는 wordpress가 mysql 과 연동이 되지않아 발생한 이슈인데, 필자의 경우 이미 mysql이나 mariaDB가 설치되어있어 3306 포트를 사용중이었다.

그래서 wordpress에서 3306포트로 접근했을때는 이미 설치되어있는 mariaDB로 접근되어 권한 및 계정이 없어 연동에 실패하였다.

이후 아래와 같이 mysql 컨테이너를 생성할때의 포트를 변경해주고, wordpress의 WORDPRESS_DB_HOST에서 뒤에 포트번호를 변경하여 wordpress와 mysql을 연동해주었다.

-p 옵션의 경우 [host 포트 번호]:[컨테이너 포트 번호]로 설정 해주어야 하므로 호스트의 3301 포트를 mysql 컨테이너의 3306 포트로 연결 해 주었다.

docker run -d -p 3301:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

docker run -d -p 8080:80 \
 -e WORDPRESS_DB_HOST=host.docker.internal:3301 \
 -e WORDPRESS_DB_NAME=wp \
 -e WORDPRESS_DB_USER=wp \
 -e WORDPRESS_DB_PASSWORD=wp \
 wordpress

이후 localhost:8080 로 접속하면 워드프레스 설정 화면이 뜨는것을 확인 할 수 있다.

docker2

이후 wordpress 설정을 완료해주면 연동한 mysql로 wordpress의 정보가 저장되있는 것을 확인 할 수 있을 것이다.

docker2

docker2