Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있습니다.
도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미한다. 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle 이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port 정보 등을 모두 가지고 있다.
레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다. 이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨. 그리고 도커는 여러 개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다. 그래서 이미지와 레이어는 같은 의미로도 사용된다. 추가적으로 DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.
이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.
- Docker 설치
- 회원가입 / 로그인
- Image로 OS 받기
- file sharing
- docker container run
- 필요한 패키지 받기
6.1 똑같은 환경으로 세팅하고 싶으면 docker file을 작성 후 build하여 image로 만들 수 있다.
그럼 같은 환경을 세팅하고 싶은 사람은 3번 부분의 image만 받아서 실행하면 똑같은 os/패키지 그대로 설정이 가능하다. ( 이래서 도커가 편리하다고 하는 것 같다 👍 )
여기로 들어가서 설치를 하면 된다
도커를 설치 후 회원가입/로그인까지 완료해 준다.
터미널을 실행 후
docker login
이렇게 도커에 로그인을 해주는 게 처음 시작이다.
우선 어떤 Image가 설치되어 있는지 확인을 한다
docker images
ubuntu, centos, couchdb 등 다양하게 설치가 되어 있는데, 이는 docker를 처음 사용하면서 얻은 나의 삽질 숭고한 희생의 결과이다 🤣 처음 docker images를 하면 많이 없을 테니 원하는 이미지(보통 처음에는 OS를 가장 먼저 받는다)를 받아 준다. 이번에는 ubuntu를 예시로 진행해 보겠습니다 🙋♂️
docker pull ubuntu
최신 버전을 받고 싶으면 docker pull ubuntu:latest로 하면 됩니다.
저희는 버전을 명시하지 않았기 때문에 latest 버전이 pull 받아질 겁니다.
만약 희망하는 버전이 있으면 docker pull ubuntu:20.04 처럼 원하는 버전을 넣으면 됩니다.
다시 docker images를 하시면 설치한 이미지를 확인할 수 있습니다.
먼저 이 데스크톱 애플리케이션에서 file sharing을 진행해야 하는데,
톱니바퀴모양/Resources/FILE SHARING 을 들어간 후 도커와 공유할 디렉토리 경로를 명세합니다.
이 과정이 중요한 이유는, 별도의 작업 없이 본인 PC 작업 환경과 공유할 수 있기 때문입니다.
저는 Desktop으로 해주었습니다.
docker container run -it --name '컨테이너이름' --hostname '커널에서 표시될 이름' -v '프로젝트경로(ubuntu 내 공유할 경로)' -p 80:80 -p 8080:8080 -p 3000:3000 '원하는 이미지' /bin/bash 를 입력합니다.
예시)
docker container run -it --name 'cybermedtest' --hostname cybermedtest -v /Users/cybermed/Desktop -p 80:80 -p 8080:8080 -p 3000:3000 ubuntu /bin/bash
이렇게 root@컨테이너 이름으로 표시가 되면 docker container에 잘 접속한 것이다 🥳
❗️ '프로젝트 경로'에는 4. file sharing에 경로를 명세해주지 않으면 에러가 뜨니 꼭 확인해 주자! ❗️
(참고로 cybermedtest:/ 뒤에 #은 root로 접속하면 #, user로 접속하면 $로 표시가 된다)
Docker 옵션 종류입니다. 옵션이 다양하고 잘 정리된 블로그가 있어 참고 하시려면 여기를 눌러주세요!
현재 여기서 docker에서 나가고 싶으면
exit
or
ctrl + d
이렇게 base로 돌아갈 수 있다.
현재 상태는 docker 접속에서 나온 것이지 도커는 계속 running 상태이다.
도커를 완전히 끄고 싶으면
docker kill '컨테이너 이름'
예시)
docker kill cybermedtest
이러면 docker는 running까지 정지된 상태이고 다시 접속하려면 run을 써주는 것이 아닌(run은 처음 만들 때 쓰는 커멘드이다)
docker restart '컨테이너 이름'
restart를 해서 컨테이너를 다시 running상태로 만들어준 후
docker exec -it '컨테이너 이름' /bin/bash
이렇게 다시 docker로 접속하면 된다 😊
이번엔 apache, php, mariadb를 다운받아 보겠습니다(순서는 php를 제일 마지막에 받아야 연동에 문제가 없다는데 자세한 건 잘 모르니, 그냥 그렇게 해보겠습니다 🥲)
❗️ 이미 서비스하고 있는 프로젝트가 있다면 꼭! 거기 환경에 맞춰서 받아야 나중에 conflict 지옥에서 벗어날 수 있습니다❗️
우선 아파치 설치 전 최신버전으로 다운 받기 위해 apt를 업데이트 해줍니다 (참고로 ubuntu에서는 apt명령어를 쓰고, centos에서는 yum 명령어를 씁니다. OS에 따라 명령어가 다르니, Don't forget check your OS 😉 )
sudo apt-get update
apt 업데이트를 딱 해주고,
sudo apt-get install apache2
우리가 사용하고 있는 OS는 ubuntu이기 때문에 apache가 아닌 apache2입니다!
진행 중 y / n 선택하는 게 있는데 냅다 y를 눌러 줍니다
설치가 완료 됐으면,
apache2 -v
아파치 2.4.52 버전이 잘 깔린 것을 확인해 줍니다.
그리고 아파치가 구동이 잘 되는지 확인을 해줍시다 🙋♂️
sudo apt install net-tools
netstat -ntlp
net-tool을 사용하기 위해 설치를 한 후, 확인을 해 보면
80포트가 LISTEN 상태인 것을 확인할 수 있습니다.
주소 창에 localhost로 접속시 저렇게 뜬다면 성공입니다 🥳
sudo apt install mariadb-server
mariadb는 커멘드 하나로 쉽게 설치할 수 있는데 따로 설정이 필요하다면 여기를 참고하면 된다.
php 최신 버전이 필요하다면
sudo apt-get install php
를 이용하여 받으면 되는데, 저는 7.4 버전이 필요하기 때문에
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4
php -v
이렇게 php 7.4버전을 다운 받고, 버전 확인까지 해줍시다!
ubuntu로 접속을 하면 위처럼 기본적으로 root로 계정이 자동 생성된다.
root로 써도 상관은 없는데 웬만하면 따로 유저를 파서 관리를 해주는 게 좋다.
보통 유저의 위치는 최상위 디렉토리의 home에 많이 위치한다. 따라서
cd home
adduser '계정명'
예시)
adduser cybermed
· useradd는 사용자 홈디렉토리를 자동으로 생성안함 + 기타 등등
· adduser는 홈디렉토리를 자동으로 생성함 + 기타 등등
위처럼 'adduser로 추가해주는 게 더 간편하다'이게 내 결론이다 🤔
사용자를 추가했으면
su - '계정명'
su와 su - 도 차이가 있는데
‘ - ’는 -l 혹은 --login과 동일한 명령어입니다.곧, su -는 su --login root와 동일한 명령인 셈입니다.
위의 설명에서 언급되어 있듯, ‘ - ’의 유무는 환경변수와 워킹디렉토리에 영향을 줍니다.
이렇게 root에서 cybermed@로 바뀌고, #에서 $로 바뀐 걸 확인할 수 있습니다 😊