안녕하세요 한소희입니다. 공부를 통해 배운 내용을 작성하고 있습니다. 혹여 해당 포스팅에서 잘못된 부분이 있을 경우, 알려주시면 빠르게 수정 조치하도록 하겠습니다. 감사합니다.
목차
ls 구현하기
컨테이너의 상태 확인하는 방법
Docker의 생명주기
Redis(이하 레디스)를 도커 환경에서 실행해보기
01. ls 구현하기
ls란, 해당 디렉토리디렉터리 내 파일이나 어떤 디렉터리가 있는지 리스트로 보여주는 명령어다. 이는 아래와 같은 코드를 이용해 구현할 수 있고, 구현 결과는 다음과 같다.
docker run alpine ls
이처럼 ls를 뒤에 적어주면, 현재 디렉토리 내 파일의 리스트를 위와 같이 보여준다.
지금 나는 alpine 라는 이미지를 불러왔다.
🔥 ls가 실행되지 않는 이미지?
가령 hello-world 에는 ls 가 실행되지 않는다. 그 이유는, hello-world 에는 ls를 실행할 수 있는 파일들이 없기 때문에, 나오지 않는 것이다. apline의 경우에는, ls를 실행시킬 수 있는 파일들이 alpine 이미지 내에 존재하기 때문에 위에서 실행이 되었던 것이다.
02. 컨테이너의 상태 확인하는 방법
# 현재 실행중인 컨테이너만 보는 방법
docker ps
# 모든 컨테이너를 보는 방법
docker ps -a
위와 같은 코드를 작성하면, 위 사진과 같은 결과물이 출력된다. 이는 컨테이너의 상태를 나타낸다.
컨테이너의 상태(STATUS)의 종류는 무엇이 있을까?
1. UP : 실행중
2. Exited : 종료
3. Pause : 일시정지
PORT 란?
컨테이너가 개방한 포트와 호스트에 연결 설정한 포트
NAME 이란?
컨테이너의 이름. --name 옵션으로 지정하지 않으면, 도커에서 알아서 임의 이름으로 지정해준다.
만약 특정 성질만 보고 싶다면 특정 부분만 지정해줄 수 있다.
방법은 아래 코드와 같다. 코드의 예시는, 성질 중 Names와 Image를 보고자 할 때를 나타낸다.
docker ps --format 'table{{.Names}}\table{{.Image}}'
03. Docker의 생명주기
Docker 의 생명주기는 생성과 실행, 중지 그리고 삭제가 있다. 나는 이 과정을 수행하는 명령어를 공부해보았다.
3-1. 생성과 실행
Docker run은, create와 start를 합친 명령어다. 따라서 아래 그림을 보면 이해가 더 잘 될 것이다.
Create를 하면, 도커의 이미지가 하드디스크에 저장된다. 그 후, 명령어로 컨테이너를 찾아 실행한다.
run을 두 명령어로 쪼갠 결과다.
🔥 -a 옵션은 뭘까?
도커 컨테이너가 실행이 될 때, 나오는 아웃풋을 화면에 실행해주는 역할이다. attach의 줄임말이다.
3-2. 도커의 중지
도커의 중지 방법은 두 가지가 있다. 크게 stop과 kill이 있다. 코드는 아래와 같다.
docker stop 컨테이너이름
docker kill 컨테이너이름
stop과 kill의 차이는 무엇일까?
stop은 컨테이너에게 정리하는 시간을 준다. 그 이후 컨테이너를 정리한 뒤 정지한다. kill은 정리하는 시간 없이 컨테이너를 그냥 멈추도록 시행한다.
3-3. 도커의 삭제
삭제 방법은 아래와 같다.
docker rm 컨테이너이름이나 아이디
만약 모든 컨테이너를 삭제하고 싶다면 아래 코드를 참고하면 된다.
docker rm `docker ps -a -q`
그런데,윈도에서는 위와 같은 에러가 발생한다.
에러 원인을 찾아보니, 윈도우에서 적용되지 않는 명령어라고 한다. 해결방법은 아래 작성해두었다.
❓❗ 에러 살펴보기
unknown shorthand flag: 'a' in -a See 'docker rm --help'.
에러 해결방법
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
명령어를 사용해 컨테이너 전체 삭제가 가능하다. 그런데 여기에서도 같은 에러가 계속 났다ㅠㅠ 그래서 찾아보니, cmd가 아닌 power shell에서 진행해야 한다는 것을 알게 됐다.
따라서 power shell을 열어 진행했고, 정상적으로 잘 작동이 됐다.
다시 한번 강조!! cmd에서 가 아닌 powershell에서 실행해야 한다!
3-4. 실행 중인 컨테이너에 명령을 전달하는 방법
실행중인 컨테이너에 명령을 전달하고 싶을 때는 아래와 같은 코드를 실행한다.
docker exec 컨테이너이름 혹은 컨테이너아이디 명령
예시를 위해 apline을 실행한 뒤 docker exec 명령을 수행하는 과정을 진행해보겠다.
alpine을 실행하는 코드(docker run alpine ping localhost)로 alpine을 실행해주고, 새 cmd 창을 열어 실행중인 컨테이너에 명령을 넣어 보겠다.
위에서 설명한 명령 중, ls 명령(디렉터리 내 파일이 무엇이 있는지 보여주는 명령)을 이용한 결과는 아래와 같다.
04. Redis(이하 레디스)를 도커 환경에서 실행해보기
레디스의 경우, (1)도커 서버가 먼저 작동하고 있어야 한다. 그 후 (2) 레디스 클라이언트를 실행해준다. 그러고 나서(3) 그 클라이언트에 명령어를 입력해 레디스 서버에 전달하는 방식으로 레디스가 구성된다.
한번, (1) 가장 먼저 진행해야 할 레디스 작동을 수행해보겠다.
docker run redis
그 후, 새로운 cmd 창을 이용해 redis-cli를 실행해보겠다.
그렇게 되면 아래와 같이 나오게 된다.
그런데, 오른쪽을 보면 에러가 나는 것을 알 수 있다.
원인은 무엇일까?
이유는 레디스 클라이언트가 레디스 서버가 있는 컨테이너 밖에서 실행을 하려고 해서 그런 것이다. 우리는 레디스 컨테이너 안에서 레디스 클라이언트를 실행해주어야 한다.
그럴 땐, 우리가 앞서 배운 exec을 활용하면 된다.
두 번째 cli를 열고 다시 명령을 수행해보면 아래 그림과 같다.
exec을 활용하면, 레디스 CLI가 잘 동작하는 것을 알 수 있다.
🔥 -it란 무엇일까?
-it를 붙여줘야, 명령어를 실행한 후 계속 명령어를 적을 수 있다고 한다. 만약 -it 가 없다면, redis-cli를 열어주기만 했다가 바로 다시 밖으로 나와버린다. 따라서 -it를 반드시 적어주도록 하자!
※ i: interactive, t: terminal을 의미
🔥 이렇게 명령어 하나를 입력할 때마다 docker exec -it 컨테이너아이디 명령어를 계속 작성해주어야 할까?
그렇지 않다. 컨테이너 안에 있는 쉘이나 터미널 환경으로 바로 접속이 가능하도록 하는 방법은, 마지막 명령어를 sh로 주면 된다. sh가 되지 않으면, bash zsh powershell으로 해도 된다. 하지만 일반적으로 sh를 쓴다. 예시는 아래와 같다.
노란 코드를 기점으로 위의 코드와 아래 코드를 비교해보자. 훨씬 간단해진 것을 알 수 있다.
'컴퓨터 사이언스 (CS) > Docker & Git' 카테고리의 다른 글
개발자 선물로 추천, 도커(Docker) 컨테이너 각티슈 케이스 (0) | 2023.01.28 |
---|---|
깃(Git) 개념 및 핵심 명령어 총 정리 (1) (0) | 2021.09.24 |
Git Push & Clone 오류 원인 - repository 인증 정책 변경 (0) | 2021.08.17 |
03. Docker Image 생성하는 방법 (0) | 2021.06.25 |
01. 도커란 무엇인가? (0) | 2021.06.10 |