도커 설치 및 실행
* 초보를 위한 도커 안내서 강의를 보고 요약한 게시물입니다.
도커를 처음 설치해서 실행해봤다.
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 옵션은 컨테이너의 디렉토리를 호스트의 특정 디렉토리에 연결하기 위해서 사용하고 컨테이너를 제거하면 컨테이너와 그 안에 생성된 파일은 삭제 되지만 호스트 디렉토리는 그대로 남기 때문에 삭제 되지 않는다고 한다.