{"id":27699537,"url":"https://github.com/zkdlu/docker-example","last_synced_at":"2026-01-22T13:48:27.022Z","repository":{"id":108918052,"uuid":"307659690","full_name":"zkdlu/docker-example","owner":"zkdlu","description":null,"archived":false,"fork":false,"pushed_at":"2021-01-07T01:02:54.000Z","size":135,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-25T17:29:28.820Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zkdlu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-10-27T10:14:17.000Z","updated_at":"2021-01-07T01:02:57.000Z","dependencies_parsed_at":"2023-04-23T16:17:21.172Z","dependency_job_id":null,"html_url":"https://github.com/zkdlu/docker-example","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zkdlu/docker-example","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkdlu%2Fdocker-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkdlu%2Fdocker-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkdlu%2Fdocker-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkdlu%2Fdocker-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zkdlu","download_url":"https://codeload.github.com/zkdlu/docker-example/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zkdlu%2Fdocker-example/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28664007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-25T17:23:59.957Z","updated_at":"2026-01-22T13:48:27.016Z","avatar_url":"https://github.com/zkdlu.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# 설치\n```bash\ncurl -fsSL https://get.docker.com/ | sudo sh\n```\n# sudo 없이 사용하기\n```bash\nsudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기\nsudo usermod -aG docker your-user # your-user 사용자에게 권한주기\n```\n\n# Docker example\n\n```dockerfile\nFROM openjdk:8-jdk-alpine\nARG JAR_FILE=target/*.jar\nCOPY ${JAR_FILE} app.jar\nENTRYPOINT [\"java\", \"-jar\", \"/app.jar\"]\n```\n\n```dockerfile\nFROM mcr.microsoft.com/dotnet/core/aspnet:3.1\nCOPY bin/Release/netcoreapp3.1/publish/ App/\nWORKDIR /App\nENTRYPOINT [\"dotnet\", \"NetCore.Docker.dll\"]\n```\n\n```dockerfile\nFROM openjdk:11-jdk-slim as builder\nCOPY . .\nWORKDIR /\nRUN chmod +x ./gradlew\nRUN ./gradlew bootjar\n\nFROM openjdk:11-jre-slim\nCOPY --from=builder build/libs/*.jar app.jar\nENTRYPOINT [\"java\", \"-jar\", \"/app.jar\"]\n```\n\u003e 통으로 복사해서 gradle빌드 하는 방법\n\n- FROM 키워드: 정규화된 Docker 컨테이너 이미지 이름\n- COPY: 지정된 폴더를 컨테이너의 폴더에 복사\n- WORKDIR: 컨테이너 내부의 현재 디렉터리를 App으로 변경\n- ENTRYPOINT: 테이너가 실행 파일로 실행되게 컨테이너를 구성하\n\n\n\n## dockerfile build\n- docker build --build-arg JAR_FILE=build/libs/*.jar -t 이미지명 .\n\n| 옵션  | 설명                                                        |\n| ----- | ---------------------------------------------------------- |\n| --force-rm=false  | 이미지 생성에 실패했을 때도 임시 컨테이너를 삭제                    |\n| -no-cache=false    | 이전 빌드에서 생성된 캐ㅣ를 사용하지 않음. 도커는 이미지 생성 시간을 줄이기 위해 각 과정을 캐시함. |\n| -q, --quiet=false |  RUN의 실행 출력 결과를 표시하지 않음 |\n| --rm=true | 이미지 생성에 성공했을 때 임시 컨테이너를 삭제 |\n| -t, --tag=\"\" | 저잣오 이름, 이미지 이름, 태그를 설정 \u003c저장소 이름\u003e/\u003c이미지 이름\u003e:\u003c태그\u003e |\n\n## 이미지-\u003e컨테이너\n- docker run -d -p 80:8080 --name 컨테이너명 이미지명\n\n\n- docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG....]\n\n| 옵션  | 설명                                                        |\n| ----- | ---------------------------------------------------------- |\n| -d    | detached mode 흔히 말하는 백그라운드 모드                    |\n| -p    | 호스트와 컨테이너의 포트를 연결 (포워딩)                      |\n| -v    | 호스트와 컨테이너의 디렉토리를 연결 (마운트)                  |\n| -e    | 컨테이너 내에서 사용할 환경변수 설정                         |\n| –-name | 컨테이너 이름 설정                                          |\n| –rm   | 프로세스 종료시 컨테이너 자동 제거                           |\n| -i   | 표준입력(stdin)을 활성화 및 컨테이너 연결 없이도 표준입력 유지  |\n| -t   | Bash 사용을 위한 명령어 셀 표시를 위해서 사용함.               |\n| -it   | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션        |\n| –link | 컨테이너 연결 [컨테이너명:별칭]                              |\n| –cap-add | cgroups얻는 것                                          |\n\n## 컨테이너-\u003e호스트 or 호스트-\u003e컨테이너 복사\n- docker cp {host path} {container}:{contianer path}\n- docker cp {container}:{container path} {host path}\n\n## 실행/종료\n- docker start 컨테이너명\n- docker stop 컨테이너명\n-  `전부 종료 : docker stop $(docker ps -a -q)`\n\n## 로그 확인\n- docker logs -f 컨테이너명\n\u003e -f : 실시간 로그 스트림\n\n## 연결\n- docker exec -it 컨테이너명 실행할프로세스\n- docker attach 컨테이너명\n\n## 이미지 목록\n- docker images\n\n## 컨테이너 목록\n- docker ps -a\n\n## 컨테이너 삭제\n- docker rm 컨테이너명\n\n## Docker 로그인\n- docker login -U \n\n## Docker Hub에 push/pull\n- docker push 이미지명\n- docker pull 이미지명\n\n## Docker Compose\n- 도커의 실행 옵션을 미리 적어둔 문서\n- 컨테이너를 여러개 만들어 실행하고 관리해야하는걸 한번에 해줌\n\n### 설치법\n1. 설치\n```bash\nsudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-`uname -s`-`uname -m` | sudo tee /usr/local/bin/docker-compose \u003e /dev/null\n```\n2. chmod 변경\n```bash\nsudo chmod +x /usr/local/bin/docker-compose\n```\n3. 심볼릭 링크 연결\n```bash\nsudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n```\n4. 확인\n```bash\ndocker-compose --version\n```\n\n```dockerfile\nversion: '3'\nservices:\n  nginx_container:\n    image: nginx:latest\n    ports:\n      - \"80:80\"\n  php_container:\n    image: php:7.3-fpm\n    ports:\n      - \"9000:9000\"\n    volumes:\n      - ./source:/source\n~                          \n```\n\n정리\n  - version : 버전 정보\n  - services : 실행할 컨테이너 목록\n    - [service] : 실행할 서비스 이름\n      - container_name: 만들어질 컨테이너 이름\n      - image : 도커 이미지\n      - volumes : symboli-link같은거인듯\n        - -./path:/in-container-path\n      - environment : 환경변수\n        - -USER=zkdlu\n      - build : 직접 이미지를 빌드할 경우\n        - context: . : docker build를 실행할 디렉토리 경로\n        - dockerfile: ./path/dockerfile-dev : 도커파일\n      - depends_on: 서비스간에 의존 관계를 형성 (다른 서비스가 먼저 동작해야 할 때)\n        - other-service\n      - ports: 포트 \n        - -\"8000:8000\"\n      - command : 서비스가 올라 올 때 Dockerfile의 CMD를 무시하고 실행할 명령어\n      \n```bash\ndocker-compose up\ndocker-compose up -d\ndocker-compose down\n```\n- 참고용: https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose#%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%8B%A4%ED%96%89\n\n## Docker Network\n- 컨테이너는 내부 IP를 순차적으로 할당을 하며, 컨테이너가 재시작 될 때마다 변경 될 수 있다.\n- 만약 외부와 연결해야 할 경우 호스트에 **veth(=virtual eth)** 라는  네트워크 인터페이스를 생성하고 컨테이너의 eth와 연결이 됨\n- veth 인터페이스는 사용자가 직접 생성할 필요 없이 도커엔진에 의해 자동으로 생성 됨\n- veth 인터페이스 뿜남 아니라 **docker()** 라는 브릿지도 있는데 이는 veth인터페이스와 바인딩 되어 호스트의 eth 인터페이스와 연결해줌\n- docker run --net=NETWORK_TYPE .....\n\u003cimg src=\"docker-network.png\" width=\"50%\" height=\"50%\"\u003e\n\n### 도커에서 제공하는 네트워크 드라이버는 **bridge, host, none, container, overlay** 가 있음\n\n  ### bridge\n  - 사용자가 정의한 브릿지를 생성해 각 컨테이너에 연결하는 네트워크 구조로 컨테이너는 연결 된 브릿지를 통해 외부와 통신할 수 있음\n  ```\n  \u003e docker network create --driver=bridge -subnet=172.19.0.0/16 [브릿지 이름]\n  ```\n  \u003e 도커 내부에서 172.19.0.~ 대역대를 사용할 수 있는 네트워크 생성\n  \u003e docker run 또는 docker create 명령어에서 --net 옵션으로 커스텀 브릿지를 사용할 수 있음\n  ```\n  \u003e docker run -i -t --name my_container --net my_bridge ubuntu:14.04\n  ```\n  \n  ### host\n  - 호스트의 네트워크 환경을 그대로 사용 함\n\n\n네트워크 정보 보기\n```\n\u003e docker network inspect [네트워크 이름]\n```\n\n\u003e 기본적으로 생성되는 컨테이너는 bridge임\n\n\u003e 컨테이너를 생성하고 bridge 네트워크 정보를 보니 내가 만든 컨테이너 목록이 들어 있었음.\n\n\u003e 실행 될 떄마다 컨테이너에 할당 되는 ip가 변경 됨 -\u003e 고정하는 법 알아야 할 듯\n\u003e - **docker run --net {네트워크} --ip {ip} {container}**\n\n\u003e docker exec -it {컨테이너} route 로 확인하면 게이트웨이인 docker0으로 나가는걸 확인 할 수 있음\n\n\n\n  \n  \n \n ### 오류\n - WSL2 환경에서 사용하고 있었는데 Docker가 없데이트 되고부터는 docker daemon이 실행중이 아니라고 작동 되지 않았다.\n - ubuntu 지우고 다시 설치하니까 되더라...\n - root passwd 초기화 하기 위해 기본 로그인을 root로 변경 해야 함. **ubuntu1804.exe config --default-user root** 이후 리눅스 접속후 passwd\n - docker를 sudo 없이 사용하기 위해 유저를 도커 그룹에 추가해준다.  **\u003e sudo usermod -aG docker $USER**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkdlu%2Fdocker-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzkdlu%2Fdocker-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzkdlu%2Fdocker-example/lists"}