copy명령어는 두가지 방식이 있는데 host -> container
cotainer -> host
이렇게 두가지 방식이 있다
아쉽게도 container -> container
방식은 cp에서 할 순 없지만 볼륨을 공유해서 하는 방법이 있다 host에서 파일을 수정하거나 만들면 컨테이너에도 그대로 적용이 된는 방식이다
docker cp <file_name> <container_NAMES>:<PATH>
기본적인 명령어 형식
cp의 또 다른 하나의 단점을 뽑자면 해당 컨테이너가 실행되어있어야 cp 명령어가 가능하다는 점이다!!
호스트에서 index.html 이라는 파일을 만들어 주었고 안에 html코드를 입력해 주었다
이후에 docker run -itd -p 60080:80 --name h1 httpd
명령어를 입력하여 실행을 시켜준다
해석: h1 이름으로 httpd를 실행 시킬껀데 외부 포트는 60080을 사용할 것이고 내부포트는 80으로 사용할것입니다
이전에는 내부에서만 확인 할수 있게 하기위해 -p(port)
옵션을 주지 않았지만 이번에는 외부에서 확인을 하기위해 따로 설정을 해주었다
외부에서 확인 할 수 있는 모습
답변을 하면 docker
의 외부포트는 firewall(방화벽)
의 지배를 받지 않고 iptables
에 의해서 자동으로 열리기 때문에 host
에서는 방화벽을 열어줄 필요없이 외부에서 접속이 가능하다
아주 똑똑해~~~
docker cp index.html h1:/usr/local/apache2/htdocs/index.html
이렇게 host -> container
로 복사를 할 수 있다
웹사이트를 새로고침하면 내가 만들어 두었던 html 파일이 정상적으로 복사되어 확인이 가능한 모습이다
container -> host
과정을 거쳐야하는데 차이점을 확인 하기 위해서
h1에 접속해 안에서 index.html 파일을 수정한 후에 cp 명령어를 이용해서 host 에서 확인하는 작업을 해보겠다
docker exec -it h1 /bin/bash
cat > htdocs/index.html << END
><html>
><body>
><h1>From Cloud-Docker-Index1.html</h1>
></body>
></html>
>END
exit
docker cp h1:/usr/local/apache2/htdocs/index.html ./index1.html
이렇게 명령어를 입력하였다
변경한후 웹사이트에서도 잘 접속되고 확인이 되는 모습이다
host 에서도 정상적으로 확인이 되는 모습
실행중인 컨테이너의 이름을 변경하는 명령어인데 실행중인 컨테이너도 가능하니 부담없이 쓰면 된다
docker rename <before_name> <after_name>
cp 명령어 처럼 host에서 가지고 있던 html 파일이나 설정 값들을 만약 h1에 넣어 줫다면 조금 설정된 파일 이라면 그런 생각이 안들겠지만 만약 엄청나게 많은 파일과 설정을 해놓았다면??
새로 컨테이너를 생성하면 또 똑같은 작업을 해줘야 하는 일이 발생을 해버린다
그것을 방지 하기위해 commit
명령어를 쓰는데 실행한 컨테이너를 다시 images화 시키는 명령어 이다
주의 할점은
컨테이너 -> 이미지화 시킬때 다시 이미지화 만들기위해 레포지토리 이름과 태그이름을 정확히 지정해줘야 한다는 점이다
docker commit h1
을 하면 이름과 이미지가 <none>
으로 뜰것이다 매우 귀찮아진다
docker commit h1 kimwooseop/webserver:test1
이런식으로 지정을 해주는 것이 좋다
docker images
로 확인 하였을때 정확히 들어온것을 볼 수 있다
그렇다면 파일이 똑같은것이 맞는지 확인을 해봐야겟다!!
docker run -itd -p 61080:80 --name test kimwooseop/webserver:test1
정상적으로 작동이 아주 잘되는 모습이다