[클라우드/Docker 기본(4) - 컨테이너 run 사용하기]

SooYeon Yeon·2022년 8월 30일
0

클라우드 Docker

목록 보기
5/24

컨테이너 실행 옵션

docker container run

옵션

-i대화식 모드 열기
-t단말디바이스 제공(마치 ssh로 연결하는 것
-d생성된 컨테이너를 백그라운드에서 동작 시킴
—name생성된 컨테이너는 기본적으로 id를 부여받고, 이 중 12자리를 이용해 관리할 수 있다.
  • 하지만 간단히 이름을 이용하여 관리하고자 하는 경우 —name을 이용해 컨테이너 이름 부여
  • 단, rename을 이용하여 나중에 변경할 수 있다.
  • 단, 동시에 다수의 컨테이너(동일한 기능을 수행하는)을 생성하는 경우에는 이름을 지정하는 것이 불필요하다.
  • 만약, 이름을 부여하지 않으면 자동으로 임의의 이름을 부여 |
    | -h 또는 —hostname | 컨테이너 내에서 사용하는 컨테이너의 호스트 이름
    호스트명을 지정하지 않으면 자동으로 id값이 호스트 이름으로 사용 |
    | —rm | 컨테이너 제거 |
    | —env | 컨테이너 내에서 사용할 시스템 환경 변수를 지정할 수 있다. |
    | -v 또는 —volume | 볼륨 마운트
  1. 호스트의 특정 디렉토리와 컨테이너의 특정 디렉토리를 마운트 할 때 사용 (데이터를 영구적으로 저장X,nfs)
  2. 별도의 볼륨을 만들어서 연결하는 방식으로도 사용된다.(iscsi,ceph구성)
    일반적으로 둘을 구분할때 아래와 같이 작성한다.
    1에서는 /home/rapa:/home/root → 절대경로로 작성(host의 특정 디렉토리)
    2에서는 myvolume:/root → myvolume이라는 볼륨을 컨테이너의 root와 마운트
    와 같이 사용한다.
    위의 볼륨은 클라우드에서 매우 중요. PV, PVC @ kubernetes

비슷한 옵션으로 —mount도 사용가능. mount는 과거에는 compose에서만 사용 가능했으나, 17번 이후부터는 container run에서도 사용이 가능하게 되었다. |
| -p | 호스트의 특정포트와 컨테이너의 특정포트를 매핑할 때 사용 (자주 사용) |
| -P | 컨테이너에서 노출한 특정 포트를 호스트의 임의의 포트와 자동 매핑 |
| —link | 두개 이상의 컨테이너를 연결하는 방법으로 ip가아닌 이름을 이용한 링킹이 가능
주로 외부에 노출되지 않은 데이터베이스와 같은 경우 웹 컨테이너와 연결할 때 사용
link옵션은 compose에서는 더이상 사용하지 않는다. |
| —restart | —restart=always
데몬 실행과 함께 자동으로 컨테이너가 실행된다.
on-failure을 사용하면 처음 컨테이너 시작 시 또는 생성시 정상실행이 되지 않거나 정상 생성이 되지 않는 경우 계속해서 실행을 시도할 수 있다. |

docker container run -it --name centos01 --hostname centos1 centos:7 /bin/bash

  • 내가 만든 centos01을 마치 ssh로하는 것처럼 명령 주고받는데 /bin/bash인 쉘로 연결해 주고 받겠다는 뜻
  • 일반적으로 it 옵션은 함께 사용하는 경우가 많다.
  • -it 뒤에 centos:7 … 컨테이너에게 전달할 명령(/bin/bash 또는 /bin/sh를 주로 사용)
  • docker container exec ctnname ls를 하면 컨테이너에 직접 들어가지 않고 외부(호스트)에서 명령을 전달하고, 결과값도 호스트에서 받을 수 있다.

—link 사용 예시

데이터베이스를 사용하는 방법

  1. 서버를 준비한다. → OS를 설치한다. → mysql을 설치한다. (BareMetal)
  2. AWS에 가서 RDS 서비스를 신청한다. (OS는 amazonlinux로 제공된다. 단, OS로 접근은 되지 않음) 애플리케이션의 설치과정 없이 신청 즉시 해당 애플리케이션으로 접속할 수 있는 서비스 = 완전관리형 서비스
  3. 도커를 이용하여 신청. 즉시 제공된다. 만약, 모든 개발자들이 동일 버전의 개발환경이 필요하다면 컨테이너를 이용한 개발이 유용하다.

mysql 배포하기

  • mysql 이미지 pull
rapa@rapa:~$ docker pull mysql:5.7
5.7: Pulling from library/mysql
66fb34780033: Pull complete 
ef4ccd63cdb4: Pull complete 
d6f28a94c51f: Pull complete 
7feea2a503b5: Pull complete 
71dd5852ecd9: Pull complete 
2ff5c3b24fd5: Pull complete 
88a546386a61: Pull complete 
65b18297cf83: Pull complete 
d64f23335fb8: Pull complete 
6ba4171261fa: Pull complete 
96dcc6c8de93: Pull complete 
Digest: sha256:b3a86578a582617214477d91e47e850f9e18df0b5d1644fb2d96d91a340b8972
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

Quiz

  1. root 패스워드 = test123

  2. 기본 데이터베이스 = testdb

  3. 외부에 공개할 포트 = 기본적으로 컨테이너는 3306/tcp를 이용하여 외부에 노출된다. 우리는 호스트의 33061번 포트를 통해 해당 DB로 접근할 수 있어야 한다.

    rapa@rapa:~$ docker image inspect mysql:5.7
    ...
    "ExposedPorts": {
                    "3306/tcp": {},
                    "33060/tcp": {}
                },
    ...
  4. 컨테이너의 이름 = mydb로 한다.

  5. 백그라운드로 동작해야함.

[확인]

rapa@rapa:~$ mysql testdb -u root -P 33061 -h 127.0.0.1 -p

로 들어갈 수 있어야함

우분투에서는 sudo apt -y install mysql-client-core-8.0으로 설치한 뒤 접속

docker container run -d --name mydb -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=testdb -p 33061:3306 mysql:5.7

기능 추가(-v, —restart)

—restart=always를 사용하면 도커 데몬이 재시작될 때 자동으로 해당 컨테이너를 실행시킨다. 만약 옵션이 없다면 컨테이너는 종료된 상태가 된다.

docker container run -it -d --name mydb -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=testdb -p 33061:3306 -v /home/rapa/mydb:/var/lib/mysql --restart=always mysql:5.7
  • mydb에 testdb가 만들어져있고, 그안에는 ob.opt 파일이 있다.
rapa@rapa:~$ sudo ls mydb/testdb/
[sudo] password for rapa: 
db.opt
rapa@rapa:
  • 접속확인
rapa@rapa:~$ mysql testdb -u root -P 33061 -h 127.0.0.1 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye

wordpress 구성하기

rapa@rapa:~$ docker container run -d --name wpdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress --restart=always mysql:5.7
7f80364862e584a8e0aeca09f434d3f502b4cc0ab70d84ab1e378b2b6f6604c6

rapa@rapa:~$ docker container run -d -e WORDPRESS_DB_PASSWORD=password -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=root --name wordpress --link wpdb:mysql -p 80:80 wordpress

wpdb:mysql , mysql은 별칭

이후

해당 포트로 접속하면 wordpress 홈페이지로 접속하게 됨

link예제-wordpress,db연결

rapa@rapa:~/0818/board$ docker container run -d --name wpdb1 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=wordpress -v wpdb1:/var/lib/mysql mysql:5.7
5c266c5de5eedbf23f51f7fd21274f758590ef131cc140179e9772a69468b225

rapa@rapa:~/0818/board$ docker container run -d --name wp1 -e WORDPRESS_DB_PASSWORD=test123 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_NAME=wordpress -p 8001:80 --link wpdb1:db1 wordpress
20be8788ddef860cb71c5a0afff93b7a6cf0a0a2c3ebe120a91d9bf956a48f34
rapa@rapa:~/0818/board$ docker container exec wp1 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.4	db1 5c266c5de5ee wpdb1 # 링크걸린 컨테이너(wpdb1)의 ID, 이름,alias과 IP 등록
172.17.0.5	20be8788ddef # 본인의ID

0개의 댓글