도커 & 쿠버네티스/docker

도커 설치 및 실행

알면 알 수록 재밌다! 2022. 5. 13. 14:22

* 초보를 위한 도커 안내서 강의를 보고 요약한 게시물입니다.

도커를 처음 설치해서 실행해봤다.

docker run ubuntu:20.04

우분투 설치

docker version

을 실행했더니 아래 에러가 발생했다.

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

해결법은 간단하다.

도커 for 데스크탑을 실행시켜야한다.

docker version

Client:
 Cloud integration: v1.0.22
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:46:56 2021
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:56 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

정상적으로 실행된다.

그럼 우분투 프로세스가 잘 돌아가는 지 확인하자

docker run --rm -it ubuntu:20.04 /bin/sh

/bin 디렉토리의 shell script로 가겠다는 뜻이다.

-it : 키보드 입력을 위함

--rm : 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록
(--rm 옵션이 없다면 컨테이너가 종료되더라도 삭제되지 않고 남아 있어 수동으로 삭제해야 함)

리눅스 명령어 참고 : https://do-jeon.tistory.com/10

ls

bin   dev  home  lib32    libx32    mnt  proc  run     srv  tmp  var
boot  etc  lib     lib64    media    opt  root  sbin  sys  usr

현재 디렉토리 안의 파일을 보여준다.

cat /etc/issue

Ubuntu 20.04.4 LTS \n \l

우분투 환경에 잘 들어온 것을 확인할 수 있다.

exit

그럼 포트까지 사용해서 이미지를 다운받아보자

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

hashicorp/http-echo 이미지를 다운받는다. 포트는 5678번을 열어주고, hello world를 출력해보자

터미널을 1개 더 열어준다.

hello world가 잘 출력된다.

호스트를 5679로 열어서 컨테이너의 5678포트로 연결된다.

그래서 docker12라는 텍스트가 출력된다.

docker run --rm -p 1234:6379 redis

레디스를 설치하고 돌려본다.
레디스는 메모리 기반 db이다.

telnet 설치 참고 : https://hellomyblog.tistory.com/34

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

-d : 실행을 백그라운드로 해서 로그가 안나옴

MYSQL_ALLOW_EMPTY_PASSWORD=true : 패스워드를 넣어야하는데 패스워드 안넣고 시도하기
--name : 이름 정의

docker exec -it mysql mysql

mysql 이미지 다운받은 것이 정상적으로 돌아간다.

exec : 실행중인 도커 컨테이너에 접속할 때 사용하며 컨테이너 안에 ssh server 설치 없이 exec 명령어로 접속함

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 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.

dokcer ps -a

정지된 컨테이너까지 확인해보자

docker rm 997e214ecdad e0fcb65e744d 19fe5b873170 7d5c48799ac2 87035717a591

안쓰는 컨테이너 삭제

docker logs -f 5bc80deb750c

컨테이너 로그 확인

-f, --tail 옵션을 줄 수 있음

tail : 파일의 마지막 10줄을 볼 수 있음
tail -n [라인 수] [파일 명] 로 보고 싶은 라인수만 볼 수도 있음
-f : 옵션을 사용하면 tail 명령이 종료하지 않고 파일 변화를 계속 확인함으로서 파일의 실시간 모니터링이 가능

출처: https://sisiblog.tistory.com/218

docker images

도커가 다운로드한 이미지를 보여줌

docker pull

docker run을 사용하면 이미지가 없을때 자동으로 다운로드를 받는다. pull을 하면 수동으로 다운로드할 수 있다.

docker rmi 컨테이너명

안쓰는 이미지 삭제가능 (ex docker rmi hashicorp/http-echo)

docker run -d -p 8080:80 \
--network=app-network \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress

docker network create app-network
docker network connect app-network mysql

도커 컨테이너 끼리 통신할 수 있게 만드는 방법

워드프레스를 띄움
기존에 생성된 컨테이너에 네트워크를 추가
그리고 mysql 컨테이너에 네트워크를 추가

  • 갑자기 에러 발생

Error response from daemon: driver failed programming external connectivity on endpoint

포트 충돌이 난 것 같다.

lsof -i :8080

그리고

kill -9 pid

그래도 에러가 났다.

내 문제는 mysql container가 안켜진 것이 이유였다.

desktop docker 에서 mysql container를 run 시켜줬더니 정상적으로 사이트가 뜬다.

만약, mysql 컨테이너를 지우고 다시 컨테이너를 깐다면, 컨테이너가 가진 데이터는 모두 사라질 것이다.

docker stop mysql
docker rm mysql
docker run -d -p 3306:3306
-e MYSQL_ALLOW_EMPTY_PASSWORD=true
--network=app-network
--name mysql
-v /Users/jihoon/mysql:/var/lib/mysql
mysql:5.7

pwd 라는 리눅스 명령어로 경로를 확인한다. mysql이라는 경로를 추가적으로 만들어줬다.
/Users/jihoon/mysql 이 경로에 만들어질것이다.

/var/lib/mysql 는 컨테이너 내부의 경로를 말한다.

docker exec -it mysql mysql

다시 mysql을 실행시켜본다.

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



다시 데이터베이스를 생성한다.

테이블은 만들었지만, 데이터까지 가져올 수는 없었다.

하지만, 이번에는 데이터가 내 컴퓨터에 쌓였다.

그럼 삭제를 해도 컨테이너 안에 데이터를 불러올 수 있을 것이다.

다시한번 mysql 을 끄고 삭제해보자.

docker stop mysql
docker rm mysql

docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--network=app-network \
--name mysql \
-v /Users/jihoon/mysql:/var/lib/mysql \
mysql:5.7


제대로 불러오는 것을 알 수 있다.

컨테이너가 사라지면 안의 데이터도 사라질 수 있다.

그래서 -v (volume)옵션을 줘서 데이터를 저장시켜야할 필요가 있다.

즉, -v 옵션은 컨테이너의 디렉토리를 호스트의 특정 디렉토리에 연결하기 위해서 사용하고 컨테이너를 제거하면 컨테이너와 그 안에 생성된 파일은 삭제 되지만 호스트 디렉토리는 그대로 남기 때문에 삭제 되지 않는다고 한다.