[Docker] 도커의 예제

Posted by 김성철

Docker - 도커 예제

참고 링크 :

https://junlab.tistory.com/216  
https://sharplee7.tistory.com/74  
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html  

도커 명령어

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]  
  
-d : detached mode 흔히 말하는 백그라운드 모드  
-p : 호스트와 컨테이너의 포트를 연결 (포워딩)  
-v : 호스트와 컨테이너의 디렉토리를 연결 (마운트)  
-e : 컨테이너 내에서 사용할 환경변수 설정  
–-name : 컨테이너 이름 설정  
–-rm : 프로세스 종료시 컨테이너 자동 제거  
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션  
-–link : 컨테이너 연결 [컨테이너명:별칭]  

ubuntu 16.04 container 실행

	=================================================================================================================  
	docker run ubuntu:16.04  
	=================================================================================================================  
  
- 실제 실행 후 콘솔로그  
	=================================================================================================================  
	PS C:\Users\USER> docker run ubuntu:16.04  
	Unable to find image 'ubuntu:16.04' locally  
	16.04: Pulling from library/ubuntu  
	58690f9b18fc: Pull complete  
	b51569e7c507: Pull complete  
	da8ef40b9eca: Pull complete  
	fb15d46c38dc: Pull complete  
	Digest: sha256:20858ebbc96215d6c3c574f781133ebffdc7c18d98af4f294cc4c04871a6fe61  
	Status: Downloaded newer image for ubuntu:16.04  
	PS C:\Users\USER>  
	=================================================================================================================  
  
run명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start) 함  

/bin/bash 명령어를 입력해서 ubuntu 컨테이너 실행

	=================================================================================================================  
	docker run --rm -it ubuntu:16.04 /bin/bash  
	=================================================================================================================  
  
- 실제 실행 후 콘솔로그  
	=================================================================================================================  
	PS C:\Users\USER> docker run --rm -it ubuntu:16.04 /bin/bash  
	root@a6430fa87b89:/## ll  
	total 72  
	drwxr-xr-x   1 root root 4096 Jul 27 08:39 ./  
	drwxr-xr-x   1 root root 4096 Jul 27 08:39 ../  
	-rwxr-xr-x   1 root root    0 Jul 27 08:39 .dockerenv*  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 bin/  
	drwxr-xr-x   2 root root 4096 Apr 12  2016 boot/  
	drwxr-xr-x   5 root root  360 Jul 27 08:40 dev/  
	drwxr-xr-x   1 root root 4096 Jul 27 08:39 etc/  
	drwxr-xr-x   2 root root 4096 Apr 12  2016 home/  
	drwxr-xr-x   8 root root 4096 Sep 13  2015 lib/  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 lib64/  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 media/  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 mnt/  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 opt/  
	dr-xr-xr-x 206 root root    0 Jul 27 08:40 proc/  
	drwx------   2 root root 4096 Aug  4  2021 root/  
	drwxr-xr-x   1 root root 4096 Aug  4  2021 run/  
	drwxr-xr-x   1 root root 4096 Aug 31  2021 sbin/  
	drwxr-xr-x   2 root root 4096 Aug  4  2021 srv/  
	dr-xr-xr-x  11 root root    0 Jul 27 08:40 sys/  
	drwxrwxrwt   2 root root 4096 Aug  4  2021 tmp/  
	drwxr-xr-x   1 root root 4096 Aug  4  2021 usr/  
	drwxr-xr-x   1 root root 4096 Aug  4  2021 var/  
	root@a6430fa87b89:/## exit  
	exit  
	PS C:\Users\USER>  
	=================================================================================================================  
  
컨테이너 내부에 들어가기 위해 bash 쉘을 실행하고 키보드 입력을 위해 -it 옵션을 줌  
추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션도 추가함  
바로 상단에서 이미지를 다운받았기 때문에 이미지다운로드 없이 바로 실행이 되었고  
리눅스 명령어가 사용이 가능함  
	※ 현재 실행하고 있는 명령창은 windows PowerShell 로 우분투 컨테이너가 아닌 상태에선 리눅스 명령어가 실행 안됨  
		=================================================================================================================  
		PS C:\Users\USER> ll  
		ll : 'll' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다.  
		 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오.  
		위치 줄:1 문자:1  
		+ ll  
		+ ~~  
			+ CategoryInfo          : ObjectNotFound: (ll:String) [], CommandNotFoundException  
			+ FullyQualifiedErrorId : CommandNotFoundException  
  
		PS C:\Users\USER>  
		=================================================================================================================  

redis container 컨테이너 실행

redis는 메모리기반의 다양한 기능을 가진 스토리지임  
6379 포트로 통신하며 telnet 명령어로 테스트해 볼 수 있음  
redis 컨테이너는 detached mode(백그라운드 모드)로 실행하기 위해 -d 옵션을 추가하고 -p 옵션을 추가하여 컨테이너의 포트를 호스트의 포트로 연결  
-d 옵션이 없다면 프로세스가 foreground로 실행되어 아무키도 입력할 수 없게 됨  
  
	=================================================================================================================  
	docker run -d -p 1234:6379 redis  
	=================================================================================================================  
  
- 실제 실행 후 콘솔로그  
	=================================================================================================================  
	PS C:\Users\USER> telnet localhost 1234  
	set mykey hihihihihihihi  
	+OK  
	get mykey  
	$14  
	hihihihihihihi  
	=================================================================================================================  
  
	※ 텔넷을 종료하기 위해선 	Ctrl + ']' 를 입력 	그다음 quit 입력후 엔터를치면 됨  
  
-d 옵션을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID(1e45278bfb0cafc15514872353b2c9aa2508a55ad9eacb846f2191295a91f1ae)를 보여주고 바로 쉘로 돌아옴  
컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있음  
-p 옵션을 이용하여 호스트의 1234포트를 컨테이너의 6379포트로 연결하였고 localhost의 1234포트로 접속하면 하면 redis를 사용할 수 있음  
  
테스트 결과 redis에 접속하여 새로운 키를 저장하고 불러오는데 성공  
실행이 간단한건 물론이고 호스트의 포트만 다르게 하면 하나의 서버에 여러개의 redis 서버를 띄우는 것도 매우 간단함  

MySQL 5.7 container 컨테이너 실행

https://hub.docker.com/_/mysql/  
※ 리눅스는 명령어 여러줄 입력시 ` 대신 \ 입력  
※ 또한 현재 로컬 PC에서 mysql 이 실행중일경우 포트를 변경  
	=================================================================================================================  
	docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql  mysql:5.7  
	=================================================================================================================  
  
-e 옵션을 이용하여 환경변수를 설정하고 --name 옵션을 이용하여 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여함  
--name옵션을 생략하면 도커가 자동으로 이름을 지어 주며, 이름은 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성함  
-d 옵션을 줘서 백그라운드로 실행하고  
-p 옵션으로 3306 포트를 사용하여 연결함  
  
- 접속  
	=================================================================================================================  
	mysql -h127.0.0.1 -uroot  
	=================================================================================================================  
  
	안됨  
	윈도우라서 환경변수를 설정해줘야함.  
	도커 데스크탑을 실행하여서 실행중인 컨테이너의 콘솔창을 띄워서 테스트를 진행하면됨  
		=================================================================================================================  
		윈도우 우측 하단의 트레이 아이콘에서 "Docker Desktop" 더블클릭  
		-> 좌측 메뉴에서 "Containers" 선택  
		-> 우측 화면에 표시되는 컨테이너들 목록에서 mysql줄에 있는 아이콘중에 마우스를 올리면  
		"Open in terminal"로 나오는 버튼이 있는데 애 클릭  
		=================================================================================================================  
  
- docker desktop 에서 실행한 Terminal 창에서 아래의 명령어 입력  
	=================================================================================================================  
	mysql -h127.0.0.1 -uroot  
	=================================================================================================================  
  
	접속 전에는 콘솔에 "sh-4.2## 로 표시되지만, 접속 후에는 "mysql>" 로 표시됨  
	=================================================================================================================  
	mysql> show databases;  
	+--------------------+  
	| Database           |  
	+--------------------+  
	| information_schema |  
	| mysql              |  
	| performance_schema |  
	| sys                |  
	+--------------------+  
	4 rows in set (0.00 sec)  
	=================================================================================================================  
  
	종료  
	=================================================================================================================  
	mysql> quit  
	Bye  
	sh-4.2##  
	=================================================================================================================  
  
- 사용자 추가  
	=================================================================================================================  
	mysql -h127.0.0.1 -uroot  
  
	//사용자 추가  
	create user 'sungchul'@'localhost' identified by '비밀번호';  
  
	//사용자 권한까지 부여  
	grant all privileges on *.* to 'sungchul'@'localhost';  
	flush privileges;  
  
	//외부 접속 가능하게 변경  
	UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='sungchul';  
	FLUSH PRIVILEGES;  
  
	quit  
	=================================================================================================================  

WordPress container 실행하기

바로 이전에 생성한 MYSQL 컨테이너에 워드프레스를 데이터베이스를 만들고  
워드프레스 컨테이너를 실행할 때 --link 옵션을 이용하여 MYSQL 컨테이너에 연결  
  
--link 옵션은 환경변수와 IP정보를 공유하는데 링크한 컨테이너의 IP정보를 /etc/hosts 에 자동으로 입력함  
그래서 워드프레스 컨테이너가 MYSQL 데이터베이스의 정보를 알 수 있게 됨  
  
워드프레스 데이터베이스를 생성하고 워드프레스 컨테이너를 실행  
호스트의 8080포트를 컨테이너의 80포트로 연결하고 mysql 컨테이너와 연결한 후 각종 데이터베이스 설정 정보를 환경변수로 입력함  
  
	MYSQL 에 접속하여 wp 사용자 생성 및 wp로 비밀번호 설정  
	=================================================================================================================  
	$ mysql -h127.0.0.1 -uroot  
	create database wp CHARACTER SET utf8;  
	grant all privileges on wp.* to wp@'%' identified by 'wp';  
	flush privileges;  
	quit  
	=================================================================================================================  
  
- 워드프레스 컨테이너 생성  
	-e 옵션으로 컨테이너에서 사용할 환경변수 설정  
	-- link 옵션으로 컨테이너에 연결  
	=================================================================================================================  
	docker run -d -p 8080:80 --link mysql:mysql -e WORDPRESS_DB_HOST=mysql `  
	-e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress  
	=================================================================================================================  
  
- 실제 실행 후 콘솔 로그  
  
	=================================================================================================================  
	PS C:\Users\USER> docker run -d -p 8080:80 --link mysql:mysql -e WORDPRESS_DB_HOST=mysql `  
	>> -e WORDPRESS_DB_NAME=wp -e WORDPRESS_DB_USER=wp -e WORDPRESS_DB_PASSWORD=wp wordpress  
	Unable to find image 'wordpress:latest' locally  
	latest: Pulling from library/wordpress  
	461246efe0a7: Already exists  
	220ce72386de: Pull complete  
	62c455a2624a: Pull complete  
	732a85e47ea2: Pull complete  
	b58ed164af39: Pull complete  
	9ff68fb88cd1: Pull complete  
	9b4c116ad467: Pull complete  
	15e33a7bc576: Pull complete  
	c1959a7d3e58: Pull complete  
	0ad42750debb: Pull complete  
	5f55bf992238: Pull complete  
	e3cc6c0f78fb: Pull complete  
	bd2892ff83c9: Pull complete  
	af560e31acb8: Pull complete  
	9e5958c36664: Pull complete  
	fdef0d0cfeec: Pull complete  
	d75f2d12ba35: Pull complete  
	5799e665d65d: Pull complete  
	d11ce5282627: Pull complete  
	94e365cce2df: Pull complete  
	abb4cae5791c: Pull complete  
	Digest: sha256:999392cfea3cee05633a0a9026fc46df637d8291e631a1afa85099ad2553e3eb  
	Status: Downloaded newer image for wordpress:latest  
	4621a37618382479782023b8ae2d6efd00ac87450f7ceb967de56cb5682e4766  
	=================================================================================================================  
  
설치가 정상적으로 완료되었으면 localhost:8080 으로 접속  
접속 후 ID / PW설정  
	sungchul / ********