docker 컨테이너 관련 기본명령어들
## 도커 기본명령어
# 컨테이너 생성
docker run [옵션] 이미지[:태그] [커맨드] [인자...]
이 명령어는 컨테이너를 생성과 동시에 실행하는 명령어다.
만약 컨테이너를 생성만 하고 싶으면
docker create [옵션] 이미지[:태그] [커맨드] [인자...]
명령어로 만들어본다.
암튼 docker run명령어로 간단하게 httpd이미지로 컨테이너를 생성해보자
docker run nginx
nginx이미지를 써서 컨테이너를 생성해보겠다는 뜻임
요러한 것들이 생기면서 화면이 멈추게 된다.
컨테이너는 실행되었으나 forground로 실행되어 명령어를 칠수 없는 상태이다.
이 상태에서 cntl + C를 누르면 다시 나갈수 있다.
나가져버렸다..
근데 마지막에 보면 exit로 나가졌다는건데 이건 컨테이너가 실행종료가 되었다는 뜻이다.
아래 명령어로 컨테이너 상태를 보면 (-a옵션은 모든 컨테이너를 보여달라는 뜻임. 죽은것까지도..)
docker ps -a
status에 exited상태인걸 알수있다. 컨테이너가 죽었다는 뜻이다.
그럼 forground모드가 아닌 background에서 실행되게 컨테이너를 생성해보면(데몬)
docker run -d nginx
이렇게 이상한 해시스트링같은게 생기면서 걍 커맨드 상태로 남아진다.
docker ps
현재 실행중인 컨테이너만 살펴보면 이렇게 잘 실행되는걸 볼 수 있다.
# 컨테이너 이름짓기
위에 사진을 그대로 쓰자면 이렇게 이름이 랜덤으로 만들어져 있다. 컨테이너는 이름(NAMES)과 아이디(CONTAINER ID)로 식별할 수 있는데 난 아이디는 띠껍게 생겨서 쓰기 싫어서 이름을 직접 지어서 관리해보겠다
docker run -d --name muzzicon nginx
요렇게 NAMES가 무찌콘인 컨테이너가 생성되었다.
# 이미지 태그
docker run -d --name muzzicon nginx
우리는 처음에 docker run에서 그냥 nginx라고 쳤다. 이러면 자동으로 걍 다운받아와지는데 기본적으로 latest태그가 붙어서 이미지가 생성된다.
때문에 우리는 이미지 이름에 태그를 아래와 같이 붙여줄 수 있다.
docker run -d --name muzzicon nginx:여기태그ㄱㄱ
아무것도 안쓰면 latest 태그로 받아온다. 보통은 latest를 자주쓴다.
그러나 이러한 태그들을 직접적으로 달아주고 싶은경우는 해당 이미지의 유효한 태그를 확인해봐야한다.
docker hub에서 이미지관련 태그들을 볼 수 있다.
https://hub.docker.com/search?q=nginx%20tags
Docker
hub.docker.com
뭐 대충 이거가 맞는지는 모르곘는데 가장 pulls 카운트가 많은 nginx를 들어가보면
뭐 이런게 뜨는데 이게 태그같음..
커멘드에서 테스트해보면
docker run -d --name mynginx1 nginx:mainline
잘 생성된걸 볼 수 있고
만약 없는태그로 해보면
docker run -d --name mynginx1 nginx:hellomuzzi
안된다
# 터미널모드로 docker run
아까 그냥 아래와같이 실행했을때는 화면이 멈췄다.
docker run nginx
터미널 생성과동시에 터미널로 실행하고 싶을떄는 아래와 같이 치면된다.
docker run -it 이미지[:태그] /bin/bash
요렇게 터미널 생성하면서 해당터미널의 bash 셀로 커맨드모드로 진입된다.
/bin/bash 는 배쉬셀을 사용하겠다라는 뜻임
사실 이건 외부에서 명령을 치는 상태이다.
실제로 도커 터미널에 직접적으로 접속하려면
docker attach 컨테이너이름
이렇게 들어간다. 물론 컨테이너가 생성되고나서다.
+ 참고로 docker run당시에 -it /bin/bash로 설정한 컨테이너만 해당된다.
# exec -it ~/bin/bash와 attach의 차이
- exec -it ~ /bin/bash는 외부에서 접속하는 터미널이다.
때문에 이 상태에서 exit를 칠 경우 터미널 접속은 해제되고 docket vm으로 돌아오지만, 컨테이너는 종료되지 않는다.
이미지에서 muzzicon 컨테이너에 exec외부터미널로 접속후, exit로 나갔을경우,
컨테이너 상태를 보면 여전히 실행중이다.
- attach는 터미널 자체로 접속한다.
때문에 여기서 exit을 칠경우 컨테이너도 중지된다
이럴경우는 cntl+p+q를 누르면 종료되지 않고 나올 수 있다.
# 터미널모드로 명령어를 바로 치고 싶을때는?
위에 이어서 바로 해당 컨테이너 터미널 모드에서 touch로 test.txt파일을 만들고 바로 vim에디터로 보려고하자
vi 명령어가 커맨드에 없다고한다.
명령어 관리하는 /bin디렉토리에 vim에디터가 없다.
이럴때 docker run 에서 컨테이너생성과 동시에 vim에디터를 설치하는 옵션이 있다.
docker run -it nginx /bin/bash -c "명령어1&&명령어2" #바로 커맨드 들어가고싶을때
docker run -d nginx /bin/bash -c "명령어1&&명령어2" #백그라운드 실행하고 싶을때
뭐 이런식으로 치면된다.
-it옵션과 배쉬셀을 빼먹었더니 문제가생겨서.. 뭔가 -c옵션과 연관있는듯?
암튼 빔에디터가 설치된 상태로 컨테이너를 생성하고 싶을때는
docker run --name muzziconn -d nginx:latest /bin/bash -c "apt-get update && apt-get install -y vim iproute2 procps iputils-ping && sleep infinity&&bash"
이런식으로 쳐주면 될듯.
추가적으로 네트워크 상태도 보고싶어서 iproute2 패키지도 같이설치함
procps는 ps 명령어 치는거임
iputils-ping은 핑명령어
sleep infinity는 프로세스 아무것도없으면 컨테이너가 죽어서..
백그라운드가아니라 바로 터미널 드가고싶을떄는 -d 대신에 -it 쓰면된다.
# 컨테이너 목록보기
docker ps
위에서 계속 써먹었지만.. 현재 만든 콘테이너들 보여주는거다.
다양한 정보가 있지만 여기서 컬럼별로 보자면
container ID와 names는 컨테이너를 식별하기 위함이고,
created는 만들어진 시간,
status는 현재상태이다.
port는 호스트에서 퍼블리싱을 해줄경우 muzzicon처럼 뜨게되고, 안해주면 muzziconn처럼 뜨게된다.
퍼블리싱은 따로 포스팅을 할 예정이다.
image는 이 컨테이너가 어떤 이미지로 만들어졌는지..
command는 뭔지모르겠다. 컨테이너가 실행될떄 사용되는 명령어라고 한다.
docker ps -a
-a옵션을 붙여주면 작동중지중인 컨테이너도 보여주는거다.
둘 차이점을 보자면
ps는 동작중인 컨테이너만 보여주고, -a옵션 커맨드는 중지중인 컨테이너도 보여줘서 doricon도 보여주게된다.
# 컨테이너 삭제
docker rm 컨테이너이름
이렇게 컨테이너를 지워줄 수 있는데, 이럴경우가 있다.
현재동작중이라 안지워진다고 에러를 뿜는다.
이럴경우엔 강제삭제옵션 -f 를 줄 수 있다.
docker rm -f 컨테이너이름
실행중인 컨테이너라도 삭제가 되었다.
# 기타 명령어들
docker start 컨테이너이름
컨테이너를 시작하는 명령어다
docker stop 컨테이너이름
중지..
docker restart 컨테이너이름
재시작..
+++++++++++++++++++++
# 컨테이너 네트워크 생성
# 이미지 목록보기
# exec실행
docker exec 컨테이너이름 커맨드명령어
해당 컨테이너에서 커맨드명령어치면 명령어 실행됨
계속 명령어 치고 싶으면
docker exec -it 컨테이너이름 /bin/bash
docker exec -it 컨테이너이름 /bin/sh 얘는꾸지니까 bash쉘쓰샘
-i 는 interactive임
-t는 --tty
docker run 옵션 image 커맨드 인자
이미지앞에 옵션이와야함.
docker logs 옵션 컨테이너이름
docker logs -f 컨테이너이름 : 실시간 로그 출력보기