Docker ~ 從入門到入坑。



文章目錄

  • Docker ~ 從入門到入坑。
  • 概述。
  • Docker 為什麼出現。
  • Docker 歷史。
  • Docker 能做什麼。
  • Docker 基本組成。
  • Docker 安裝。
  • Docker 卸載。
  • 阿里雲鏡像加速。
  • 底層原理。
  • 常用命令。
  • 幫助命令。
  • 鏡像命令。
  • docker images。
  • docker search。
  • docker pull。
  • docker rmi。
  • 容器命令。
  • 列出所有運行的容器。
  • 列出所有的容器。
  • 退出容器。
  • 刪除容器。
  • 啓動和停止容器。
  • 其他常用命令。
  • 後台啓動容器。
  • 查看日誌。
  • 容器中的進程信息 ~ top。
  • docker inspect。容器元數據。
  • 進入當前正在運行的容器。docker exec / attach。
  • 從容器內拷貝文件到主機。
  • eg.
  • 部署 Nginx。
  • 部署 Tomcat。
  • Elasticsearch + Kibana。
  • -e ~ 環境參數。
  • 使用 Kibana 連接 Elasticsearch。
  • 可視化 ~ Rancher(CI/CD)。
  • 可視化 ~ portainer。
  • Docker 鏡像。
  • Docker 鏡像加載原理。
  • commit 鏡像。
  • 容器數據卷。
  • 使用命令掛載 -v。
  • MySQL 數據。
  • 具名掛載 & 匿名掛載。
  • 匿名掛載。
  • 具名掛載。
  • 具名掛載 & 匿名掛載 & 指定路徑掛載。
  • DockerFile。
  • 數據卷容器。
  • 多個數據庫實現數據共享。
  • DockerFile。
  • DockerFile 指令。
  • 創建一個自己的 Centos。
  • docker history。鏡像構建詳情。
  • CMD & ENTRYPOINT。
  • 製作 Tomcat Dokerfile。
  • 發佈鏡像。
  • 發佈到阿里雲鏡像。
  • Docker 網絡。
  • docker0。
  • --link。
  • docker network。
  • 自定義網絡 ~ docker network。
  • 自己創建一個 Docker network。
  • 網絡連通。
  • Redis 集羣。
  • Spring Boot 微服務打包 Docker 鏡像。



概述。

Docker 為什麼出現。

一款產品,開發 ~ 上線,兩套環境。

“我在我的電腦上可以運行!”。

環境配置十分麻煩,每一台機器都要部署環境(集羣 Redis、ES、Hadoop)。費時費力。

傳統:開發 jar,運維來作。
現在:開發打包部署上線,一套流程做完。

java ~ apk ~ 發佈(應用商店)~ 張三使用 apk ~ 安裝即可用。
java ~ jar(+環境)~ 打包項目帶上環境(鏡像)~(Docker 倉庫:商店)~下載我們發佈的鏡像 ~ 直接運行即可。

Docker 的思想來自於集裝箱。



Docker 歷史。

2010 年,幾個年輕人,在美國成立了一家公司 DotCloud。做一些 PASS 雲計算服務,Linux 的有關的容器技術。他們將自己的技術(容器化技術)命名 Docker

Docker 剛蛋生的時候,沒有引起行業注意。

↓ ↓ ↓

2013 開源。

2014 年 9 月,Docker 1.0 發佈。

在容器技術出來之前,虛擬機技術。
虛擬機:在 Windows 裝一個 VMWare,要虛擬一台電腦,笨重。
Docker:隔離,鏡像(最核心的環境 4M + jdk + MySQL)十分小巧,運行鏡像即可。



文檔:https://docs.docker.com/

倉庫:https://www.docker.com/products/docker-hub

Docker 能做什麼。

  • 虛擬機技術。

資源佔用多。
冗餘步驟多。
啓動慢。

docker push 如果已存在會自動覆蓋嗎_ide

  • 容器化技術。

docker push 如果已存在會自動覆蓋嗎_ide_02

  • DevOps(開發、運維)。
  • 應用更快速的交付和部署。
    傳統:一堆幫助文檔,安裝程序。
    Docker:打包鏡像發佈測試,一鍵運行。
  • 更便捷的升級和擴縮容。
    Docker 部署應用就像搭積木一樣,項目打包為一個鏡像。
  • 更簡單的系統運維。
    開發、測試環境高度一致。
  • 更高效的計算資源。
    Docker 是內核級別的虛擬化,可以在一個物理機上運行很多容器實例。服務器的性能可以被壓榨到極致。


Docker 基本組成。

docker push 如果已存在會自動覆蓋嗎_docker_03

  • 鏡像 image。
    Docker 鏡像就好比一個模板,可以通過這個模板來創建容器服務,Tomcat 鏡像 --> run --> tomcat01容器(提供服務器),通過這個鏡像可以創建多個容器(最終服務運行或項目運行就是在容器中)。
  • 容器 container。
    Docker 利用容器技術,獨立運行一個或一個組應用,通過鏡像來創建的。可以理解為一個簡易的 Linux 系統。
  • 倉庫 repository。
    倉庫就是存放鏡像的地方。
    倉庫分為共有倉庫和私有倉庫。
    Docker Hub(默認,國外的)。
    阿里雲,華為雲都有容器服務器。配置鏡像加速。


Docker 安裝。

https://docs.docker.com/engine/install/centos/

CentOS 7 安裝 Docker~並更換國內源。

[geek@192 tools_my]$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/


Docker 卸載。

Uninstall Docker Engine

Uninstall the Docker Engine, CLI, and Containerd packages:

$ sudo yum remove docker-ce docker-ce-cli containerd.io

Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:

$ sudo rm -rf /var/lib/docker

You must delete any edited configuration files manually.



阿里雲鏡像加速。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://********.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker


底層原理。

Docker 是一個 Client - Server 結構的系統,Docker 的守護進程運行在主機上,通過 Socket 從客户端訪問。

Docker Server 接收到 Docker Client 的指令,就會執行這個命令。

docker push 如果已存在會自動覆蓋嗎_docker_04

  • Docker 為什麼比虛擬機快?

Docker 有着比虛擬機更少的抽象層。
Docker 利用的是宿主機的內核,vm 需要是 Guest OS。

所以説,新建一個容器的時候,Docker 不需要像虛擬機一樣重新加載一個操作系統的內核,避免引導。虛擬機是加載 Guest OS,分鐘級別的,而 Docker 是利用宿主機的操作系統,省略了這個複雜的過程。



常用命令。

docker push 如果已存在會自動覆蓋嗎_Docker_05

docker push 如果已存在會自動覆蓋嗎_ide_06

幫助命令。

docker version # 顯示 Docker 的版本信息。
docker info # 顯示 Docker 的系統信息,包括鏡像和容器的數量。
docker 命令 --help # 幫助命令。

[geek@192 ~]$ sudo docker
[sudo] password for geek: 

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST
                           env var and default context set with "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

https://docs.docker.com/engine/reference/run/



鏡像命令。
docker images。

顯示本地所有鏡像。

[geek@192 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7.29              413be204e9c3        4 months ago        456MB
hello-world         latest              fce289e99eb9        20 months ago       1.84kB

REPOSITORY
TAG
IMAGE ID
CREATED
SIZE

Name, shorthand

Default Description

–all , -a

Show all images (default hides intermediate images)

–digests

Show digests

–filter , -f

Filter output based on conditions provided

–format

Pretty-print images using a Go template

–no-trunc

Don’t truncate output

–quiet , -q

Only show numeric IDs



docker search。

搜索鏡像。

docker search [OPTIONS] TERM
Extended description
Search Docker Hub for images

For example uses of this command, refer to the examples section below.

Options

Name, shorthand

Default

Description

–automated (deprecated)

Only show automated builds

–filter, -f

Filter output based on conditions provided

–format

Pretty-print search using a Go template

–limit

25

Max number of search results

–no-trunc

Don’t truncate output

–stars , -s(deprecated)

Only displays with at least x stars



docker pull。

下載鏡像。

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

[geek@192 ~]$ sudo docker pull mysql
Using default tag: latest  # 如果不寫 tag,默認下載最新版本 latest。
latest: Pulling from library/mysql
d121f8d1c412: Pulling fs layer  # 分層下載。docker image 的核心,聯合文件系統。

[geek@192 ~]$ sudo docker pull mysql:5.7.29
5.7.29: Pulling from library/mysql
54fec2fa59d0: Already exists   # 分層下載。docker image 的核心,聯合文件系統。
bcc6c6145912: Already exists 
951c3d959c9d: Already exists 
05de4d0e206e: Pull complete 
319f0394ef42: Pull complete 
d9185034607b: Pull complete 
013a9c64dadc: Pull complete 
58b7b840ebff: Pull complete 
9b85c0abc43d: Pull complete 
bdf022f63e85: Pull complete 
35f7f707ce83: Pull complete 
Digest: sha256:95b4bc7c1b111906fdb7a39cd990dd99f21c594722735d059769b80312eb57a7
Status: Downloaded newer image for mysql:5.7.29
docker.io/library/mysql:5.7.29


docker rmi。

刪除鏡像。

Name, shorthand

Default

Description

–force , -f

Force removal of the image

–no-prune

Do not delete untagged parents

docker rmi -f 鏡像 id # 刪除指定的鏡像。
docker rmi -f 鏡像 id 鏡像 id 鏡像 id # 刪除多個鏡像。
docker rmi -f $(docker images -aq) # 刪除全部鏡像。



容器命令。

有了鏡像才可以創建容器。

docker pull centos

docker run --help
docker run [可選參數] image
–name=“容器名”
-d ~ 後台方式運行。
-it ~ 使用交互方式運行,進入容器查看內容。
-p ~ 指定容器端口。
 -p ip:主機端口:容器端口。
 -p 主機端口:容器端口。(常用)。
 -p 容器端口(不需要外部訪問,容器內部端口)。
 容器端口。
-P ~ 隨機端口。



列出所有運行的容器。

docker ps



列出所有的容器。

docker ps -a

-n=? # 列出最近創建的容器。
-q # 只顯示容器的編號。



退出容器。

exit # 容器停止並退出。
Ctrl + P + Q # 容器不停止退出。



刪除容器。

docker rm 容器 id。
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm



啓動和停止容器。

docker start 容器 id。
docker stop 容器 id。
docker restart 容器 id。
docker kill 容器 id。 # 強制。



其他常用命令。
後台啓動容器。
docker run -d centos

// 問題。docker ps 發現 centos 停止了。

Docker 容器使用後台運行,就必須要有一個前台進程。docker 發現沒有前台應用,就會自動停止該容器。

eg. Nginx。



查看日誌。
[geek@192 ~]$ sudo docker logs --help
[sudo] password for geek: 

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for
                       42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m
                       for 42 minutes)

docker logs -tf -tail 10 容器 id。



容器中的進程信息 ~ top。

docker top 容器 id。

[geek@192 ~]$ sudo docker top be45da4c5b93
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             7501                7486                0                   22:33               ?                   00:00:01            mysqld


docker inspect。容器元數據。
[geek@192 ~]$ sudo docker inspect --help

Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

Options:
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type
[geek@192 ~]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
be45da4c5b93        413be204e9c3        "docker-entrypoint.s…"   4 months ago        Up 29 minutes       33060/tcp, 0.0.0.0:3307->3306/tcp   mysql_geek
[geek@192 ~]$ sudo docker inspect be45da4c5b93
[
    {
        "Id": "be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877",
        "Created": "2020-04-06T22:15:58.597019498Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "mysqld"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 7501,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-08-27T14:33:34.678287048Z",
            "FinishedAt": "2020-08-27T14:00:12.753590425Z"
        },
        "Image": "sha256:413be204e9c34f31476a0680b6521873fb519c749693b181228ff47492a7fe3b",
        "ResolvConfPath": "/var/lib/docker/containers/be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877/hostname",
        "HostsPath": "/var/lib/docker/containers/be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877/hosts",
        "LogPath": "/var/lib/docker/containers/be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877/be45da4c5b93d8d82753dce660fdbf0184c117bdf72d9ee856665f481f623877-json.log",
        "Name": "/mysql_geek",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "3306/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "3307"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/b0db5ee46558d330232ea016336067d1890a948c10a74c5fbcc95ce84809c9b6-init/diff:/var/lib/docker/overlay2/34435b08289bb58d920e294bdc084abb5e7bd8ca6eeeebeac585aa3d58bd1745/diff:/var/lib/docker/overlay2/a956e638e9365fa896fcacfa4819aa45b5126f6f774a33f1b4c22fb8915ea759/diff:/var/lib/docker/overlay2/c9cf19bd7db463e098c5c31c26b6709b78d7482116fc4239a3dcd66b277c8026/diff:/var/lib/docker/overlay2/19454098e97f64a4edc53cd3f5cef4e0ba0d2145a7927845586f2fd209ddaa1a/diff:/var/lib/docker/overlay2/9529736c0acd4d18a5a6540b8af98b2dcf9368948af7121850dd5f693c10a06b/diff:/var/lib/docker/overlay2/8cb480298f4e7d3f54b3ed365fb222e73e2a47b7128dcfc7902952569497a6a3/diff:/var/lib/docker/overlay2/7550a0aad73c643bca6a01239c3709aead185080b909bd7dab9257e5f3f0dfa8/diff:/var/lib/docker/overlay2/998e4a5bc1d6e6a124e25cb69155283da2cdf0472284bac785839be224a62d10/diff:/var/lib/docker/overlay2/49948aaa148f15b67fb990a88ee8aa1c36a311f5b45f3988fcad734a55e11475/diff:/var/lib/docker/overlay2/2462775172a6a17f6e925bb15e47c25c99bb785a83f56ff22e2afba745a024f9/diff:/var/lib/docker/overlay2/d00eb80fb1c1d284d5054c36176f3459e737194cf9b01af83fa2f150ef7b5141/diff",
                "MergedDir": "/var/lib/docker/overlay2/b0db5ee46558d330232ea016336067d1890a948c10a74c5fbcc95ce84809c9b6/merged",
                "UpperDir": "/var/lib/docker/overlay2/b0db5ee46558d330232ea016336067d1890a948c10a74c5fbcc95ce84809c9b6/diff",
                "WorkDir": "/var/lib/docker/overlay2/b0db5ee46558d330232ea016336067d1890a948c10a74c5fbcc95ce84809c9b6/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "c7f8b6a9062ee284710b8d3f60eab7ce5da5642f5ca5c1500ece8dd0f2473559",
                "Source": "/var/lib/docker/volumes/c7f8b6a9062ee284710b8d3f60eab7ce5da5642f5ca5c1500ece8dd0f2473559/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "be45da4c5b93",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {},
                "33060/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "MYSQL_ROOT_PASSWORD=root",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.7",
                "MYSQL_MAJOR=5.7",
                "MYSQL_VERSION=5.7.29-1debian10"
            ],
            "Cmd": [
                "mysqld"
            ],
            "Image": "mysql:5.7.29",
            "Volumes": {
                "/var/lib/mysql": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "22742b719119538aa2cbe6996586f06fa966624f7017a68041b5fc3b01688e5a",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "3306/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "3307"
                    }
                ],
                "33060/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/22742b719119",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "57d39a8070c00926eb6b93160f6929240f452e60b099f9875dd5f8c3de3e3747",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "38931101b374d0d8b7ff824e014421b6205795b47203d791b5f38c59d3e3cdc9",
                    "EndpointID": "57d39a8070c00926eb6b93160f6929240f452e60b099f9875dd5f8c3de3e3747",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]


進入當前正在運行的容器。docker exec / attach。

docker exec -it 容器 id /bin/bash

docker attach 容器 id。
// # 正在執行的代碼。。。

docker exec # 進入容器後開啓一個新的終端。
docker attach # 進入容器正在執行的終端。



從容器內拷貝文件到主機。

docker cp 容器 id :容器內路徑 目的主機路徑。



eg.

部署 Nginx。

sudo docker run -d --name nginx01 -p 3344:80 nginx
-d ~ 後台運行。
–name ~ 容器命名。
-p ~ 宿主機端口:容器內部端口。

docker push 如果已存在會自動覆蓋嗎_Docker_07

sudo docker run -d --name nginx01 -p 3344:80 nginx



部署 Tomcat。

官方。
$ docker run -it --rm tomcat:9.0
// 我們之前啓動都是後台,停止了容器後,容器還是可以查到的。
docker run -it --rm,一般用來測試,用完即刪除。

docker run -d -p 3355:8080 --name tomcat01 tomcat

[geek@192 ~]$ sudo docker exec -it tomcat01 bash
root@12e7591a8ba0:/usr/local/tomcat# ll
bash: ll: command not found
root@12e7591a8ba0:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@12e7591a8ba0:/usr/local/tomcat# ls webapps

–> 閹割了的。默認最小鏡像。

實際上是藏在了

root@12e7591a8ba0:/usr/local/tomcat# ls webapps.dist/
ROOT  docs  examples  host-manager  managercp

root@12e7591a8ba0:/usr/local/tomcat# cp -r webapps.dist/* webapps/
# 就可以了。


Elasticsearch + Kibana。

ES 暴露的端口很多。
ES 十分耗內存。
ES 的數據一般需要放置到安全目錄。掛載。

sudo docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.6.2

docker status # 查詢 CPU 狀態。

-e ~ 環境參數。
[geek@192 ~]$ sudo docker run -d --name elasticsearch_my -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e  ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 
c2fcf4c8d46eaf6a8a687f7fd0ed46acd99c17dc9b044694eb818e57fd6fe896
[geek@192 ~]$ curl localhost:9200
{
  "name" : "c2fcf4c8d46e",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "xOgyKNJYS6qAjAp14Gd80A",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}


使用 Kibana 連接 Elasticsearch。


可視化 ~ Rancher(CI/CD)。



可視化 ~ portainer。

https://www.portainer.io/installation/

// $ docker volume create portainer_data
$ sudo docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

docker push 如果已存在會自動覆蓋嗎_Docker_08

docker push 如果已存在會自動覆蓋嗎_docker_09



Docker 鏡像。

鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置文件。
所有的應用,直接打包 Docker 鏡像,就可以直接跑起來。

得到鏡像方式。

  • 從遠程倉庫下載。
  • 朋友拷貝。
  • 自己製作。DockerFile。
Docker 鏡像加載原理。
  • UnionFS(聯合文件系統)。

UnionFS(聯合文件系統):Union 文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,ta 支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。 Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。

特性:一次同時加載多個文件系統,但從外面看起來,只能到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。

  • Docker 鏡像加載原理。

docker 的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統 UnionFS 。

bootfs(boot file system)主要包含 bootloader 和 kernel。bootloader 主要是引導加載 kernel,Linux 剛啓動時會加載 bootfs 文件系統,在 Docker 鏡像的最底層是 bootfs。這一層與我們典型的 Linux/Unix 系統是一樣的,包含 boot 加載器和內核。當 boot 加載完成之後整個內核就都在內存中了,此時內存的使用權已由 bootfs 轉交給內核,此時系統也會卸載 bootfs 。
rootfs (root file system) ,Gbootfs 之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs 就是各種不同的悍作系統發行版, 比如 Ubuntu,Centos 等等。

對於一個精簡的 OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序庫就可以了,因為底層直接用 Host 的 kernel,自己只需要提供 rootfs 就可以了。由此可見對於不同的 linux 發行版,bootfs 基本是一致的,rootfs 會有差別,因此不同的發行版可以共用 bootfs。



commit 鏡像。

docker commit -m=“提交的描述信息。” -a=“作者” 容器id 目標鏡像名:【tag】



容器數據卷。

將應用和環境打包成一個鏡像。

數據?如果數據在容器中,容器刪除了,數據就會丟失。

↓ ↓ ↓

需求:數據持久化。

容器之間數據共享。Docker 容器中產生的數據,同步到本地。

↓ ↓ ↓

卷技術。目錄的掛載,將容器內的目錄掛載到 Linux 上。

容器的持久化和同步操作,容器間也是可以數據共享的。

volume
n. 體積;容積;容量;量;額;音量;響度

使用命令掛載 -v。

docker run -it -v /home/test:/home centos /bin/bash
(宿主機目錄:容器中目錄)。

docker inspect 容器 id
可以查看 “Mounts”: {} 信息。



MySQL 數據。

sudo docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

https://hub.docker.com/_/mysql

Start a mysql server instance
Starting a MySQL instance is simple:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

… where some-mysql is the name you want to assign to your container, my-secret-pw is the password to be set for the MySQL root user and tag is the tag specifying the MySQL version you want. See the list above for relevant tags.



具名掛載 & 匿名掛載。
匿名掛載。

-v 只寫了容器內路徑,沒有寫容器外路徑。

-v 容器內路徑。

sudo docker run -d -P --name nginx01 -v /etc/nginx nginx

查詢所有卷的情況。

sudo docker volume ls

[geek@192 home]$ sudo docker run -d -P --name nginx02 -v /etc/nginx nginx
d2dcf546680909c706dd3a99b258f7c197df09dce3f9b6d2bf765ccd6352996e
[geek@192 home]$ sudo docker volume ls
DRIVER              VOLUME NAME
local               26e2e8983157124a7b1b22c9065d2632b21e9f74285a59dda8e8c50208db7060
local               489a715c27862b4cd02d07dcd3bc426b8275e2e95aa1e909f2559c166d1a8637
local               af0464e09659ec3f603f21dc510f7e796c2641b034eed920dad1bbf7dee7aa09
local               c7f8b6a9062ee284710b8d3f60eab7ce5da5642f5ca5c1500ece8dd0f2473559
local               c472cb9f164c403ad8225073e2c64600ccf31ee0cf81cd5cd65fee1b1ae36b96
local               portainer_data

VOLUME NAME (…)~ 匿名掛載。



具名掛載。

-v 卷名:容器內路徑。

[geek@192 home]$ sudo docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
b51e5ff1e5eed7416d1ff319912abf26f99765379ad63adfbf06386ad030ffcd
[geek@192 home]$ sudo docker volume ls
DRIVER              VOLUME NAME
local               26e2e8983157124a7b1b22c9065d2632b21e9f74285a59dda8e8c50208db7060
local               489a715c27862b4cd02d07dcd3bc426b8275e2e95aa1e909f2559c166d1a8637
local               af0464e09659ec3f603f21dc510f7e796c2641b034eed920dad1bbf7dee7aa09
local               c7f8b6a9062ee284710b8d3f60eab7ce5da5642f5ca5c1500ece8dd0f2473559
local               c472cb9f164c403ad8225073e2c64600ccf31ee0cf81cd5cd65fee1b1ae36b96
local               juming-nginx
local               portainer_data

所有 Docker 容器內的卷,沒有指定目錄的情況下都是在 /var/lib/docker/volumes/

[geek@192 home]$ sudo docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-08-28T04:49:02+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]


[geek@192 home]$ sudo ls /var/lib/docker
[sudo] password for geek: 
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes

[geek@192 home]$ sudo ls /var/lib/docker/volumes
26e2e8983157124a7b1b22c9065d2632b21e9f74285a59dda8e8c50208db7060
489a715c27862b4cd02d07dcd3bc426b8275e2e95aa1e909f2559c166d1a8637
af0464e09659ec3f603f21dc510f7e796c2641b034eed920dad1bbf7dee7aa09
c472cb9f164c403ad8225073e2c64600ccf31ee0cf81cd5cd65fee1b1ae36b96
c7f8b6a9062ee284710b8d3f60eab7ce5da5642f5ca5c1500ece8dd0f2473559
juming-nginx
metadata.db
portainer_data


具名掛載 & 匿名掛載 & 指定路徑掛載。

-v 容器內路徑 ~ 匿名掛載。
-v 卷名:容器內路徑 ~ 具名掛載。
-v /宿主機路徑:容器內路徑 ~ 指定路徑掛載。

通過 -v 容器內路徑:ro rw 改變主讀寫權限。

ro readonly # 只讀。只能通過宿主機改變。
rw readwrite # 可讀可寫。

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx



DockerFile。

用來構建 Docker 鏡像的構建文件。

[geek@192 home]$ sudo vim dockerfile1
[sudo] password for geek: 
[geek@192 home]$ cat dockerfile1 
from centos

volume ["volume01", "volume02"]

cmd echo " ~ ~ ~ ~ ~ ~ ~ end ~ ~ ~ ~ ~ ~ ~ "
cmd /bin/bash

docker build -f dockerfile -t geek/centos .

[root@192 docker_my]# sudo docker build -f dockerfile1 -t geek/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : from centos
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
 ---> 0d120b6ccaa8
Step 2/4 : volume ["volume01", "volume02"]
 ---> Running in 277b718b809d
Removing intermediate container 277b718b809d
 ---> dfa0fa8cc0e2
Step 3/4 : cmd echo "~~~end~~~"
 ---> Running in b37dd2e5eb21
Removing intermediate container b37dd2e5eb21
 ---> 99450a70efa2
Step 4/4 : cmd /bin/bash
 ---> Running in 08600e6c2e77
Removing intermediate container 08600e6c2e77
 ---> 451f7a75e694
Successfully built 451f7a75e694
Successfully tagged geek/centos:latest

docker inspect 容器id

假設構建鏡像時沒有掛載卷,要手動掛載 -v 卷名:容器內路徑。



數據卷容器。

[root@192 docker_my]# sudo docker run -it --name docker01 geek/centos

Ctrl + P + Q(大寫狀態下)退出當前容器但不關閉。

docker run -it --name docker02 --volumes-from docker01 centos

啓動第二個鏡像,同步第一個的數據。

[root@192 docker_my]# sudo docker run -it --name docker02 --volumes-from docker01 geek/centos

[root@50a6da234a39 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
  • 進入 docker01 touch 一個文件。
[root@192 docker_my]# sudo docker attach docker01
[root@e8335036b13a /]# ls
bin  dev  docker01  etc  home  lib  lib64  lost+found  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var	volume01  volume02
[root@e8335036b13a /]# cd volume01
[root@e8335036b13a volume01]# touch docker01
  • docker 02 查看。
[root@192 docker_my]# sudo docker attach docker02
[root@50a6da234a39 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@50a6da234a39 /]# cd volume01
[root@50a6da234a39 volume01]# ls
docker01


多個數據庫實現數據共享。

sudo docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

sudo docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-from mysql01 mysql:5.7

容器之間的配置信息傳遞,數據卷容器生命週期一直秩序到沒用容器使用為止。



DockerFile。

DockerFile 是用來構建 docker 鏡像的文件。命令參數腳本。

步驟。

  • 編寫一個 dockerfile 文件。
  • docker build 構建成為一個鏡像。
  • docker run 運行鏡像。
  • docker push 發佈鏡像(DockerHub、阿里雲鏡像倉庫)。

每個保留關鍵字(指令)都必須是大寫字母。

指令從上到下順序執行。

# 表示註釋。

每一個指令都會創建提交一個新的鏡像層,並提交。

docker push 如果已存在會自動覆蓋嗎_docker_10

Dockerfile 是面向開發的。我們以後要發佈項目,做鏡像,就需要編寫 Dockerfile 文件。

Docker 鏡像逐漸成為企業交付的標準。

DockerFile ~ 構建文件,定義了一切的基礎,源代碼。

DockerImage ~ 通過 DockerFile 構建生成的鏡像,最終發佈和運行的產品。

Docker 容器 ~ 鏡像運行起來提供服務器。



DockerFile 指令。
  • FROM
    這個鏡像的媽媽是誰?
    基礎鏡像,一切從這裏開始。
  • MAINTAINER
    誰負責養 ta。維護者信息。姓名 + 郵箱。
  • RUN
    鏡像構建時候需要執行的命令。
    你想讓 ta 幹啥。(在命令前加上 RUN 即可)。
  • ADD
    給 ta 點創業基金。(COPY 文件,會自動解壓)。
    Tomcat 鏡像,Tomcat 壓縮包。
  • WORKDIR
    我是 cd,今天剛化了妝。
  • VOLUME
    給 ta 一個存放行李的地方。設置卷,掛載主機目錄。
  • EXPOSE
    ta 要打開的門是啥。指定對外的端口。
  • RUN
    奔跑吧。
  • CDM
    容器啓動時要運行的命令。只有最後一個會生效,可被替代。
  • ENTRYPOINT
    容器啓動時要運行的命令。可追加命令。
  • ONBUILD
    當構建一個被繼承的 DockerFile,會運行 ONBUILD 指令。
  • COPY
    類似 ADD 命令。將文件拷貝到鏡像。
  • ENV
    構建時設置環境變量。


創建一個自己的 Centos。

https://hub.docker.com/_/scratch

FROM scratch
This image is most useful in the context of building base images (such as debian and busybox) or super minimal images (that contain only a single binary and whatever it requires, such as hello-world).

As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile, and will not create an extra layer in your image (so a previously 2-layer image will be a 1-layer image instead).

From https://docs.docker.com/engine/userguide/eng-image/baseimages/:

You can use Docker’s reserved, minimal image, scratch, as a starting point for building containers. Using the scratch “image” signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image.

While scratch appears in Docker’s repository on the hub, you can’t pull it, run it, or tag any image with the name scratch. Instead, you can refer to it in your Dockerfile. For example, to create a minimal container using scratch:

FROM scratch
COPY hello /
CMD ["/hello"]
  • 編寫 DockerFile 文件。
[geek@192 docker_my]$ cat geekdockerfile-centos 
FROM centos
MAINTAINER geek<YifanLiGeek@gmail.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo MYPATH
CMD echo " ~ ~ ~ end ~ ~ ~ "
CMD /bin/bash
  • 構建鏡像。
[geek@192 docker_my]$ sudo docker build -f geekdockerfile-centos -t geekcentos:1.0 .
[sudo] password for geek: 
Sending build context to Docker daemon  3.072kB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
Step 2/10 : MAINTAINER geek<YifanLiGeek@gmail.com>
 ---> Running in 7a6a8439f554
Removing intermediate container 7a6a8439f554
 ---> 59e173e7c4d0
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 9f8ae4f21974
Removing intermediate container 9f8ae4f21974
 ---> 8f16e7d0dee3
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 2edf61a0944c
Removing intermediate container 2edf61a0944c
 ---> 82fe516a0098
Step 5/10 : RUN yum -y install vim
 ---> Running in a10739bb0bd6
CentOS-8 - AppStream                            801 kB/s | 5.8 MB     00:07    
CentOS-8 - Base                                 329 kB/s | 2.2 MB     00:06    
CentOS-8 - Extras                                11 kB/s | 8.1 kB     00:00    
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.el8         AppStream       48 k
 which               x86_64      2.21-12.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        116 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 123 kB/s |  48 kB     00:00    
(3/5): which-2.21-12.el8.x86_64.rpm             133 kB/s |  49 kB     00:00    
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  239 kB/s | 1.4 MB     00:05    
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm    605 kB/s | 6.3 MB     00:10    
--------------------------------------------------------------------------------
Total                                           677 kB/s | 7.8 MB     00:11     
CentOS-8 - AppStream                            711 kB/s | 1.6 kB     00:00    
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY                                                                       
Importing GPG key 0x8483C65D:                                                                                 
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"                                    
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D                                               
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial                                                     
Key imported successfully                                                                                     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : which-2.21-12.el8.x86_64                               1/5 
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/5 
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/5 
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5 
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5 
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5 
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5 
  Verifying        : which-2.21-12.el8.x86_64                               5/5 

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64    
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64             

Complete!
Removing intermediate container a10739bb0bd6
 ---> 18140b90867c
Step 6/10 : RUN yum -y install net-tools
 ---> Running in f7ecade2e25a
Last metadata expiration check: 0:00:27 ago on Sun Sep 27 11:44:55 2020.
Dependencies resolved.
================================================================================
 Package         Architecture Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.51.20160912git.el8       BaseOS       323 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm   262 kB/s | 323 kB     00:01    
--------------------------------------------------------------------------------
Total                                           172 kB/s | 323 kB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 
  Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 
  Verifying        : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 

Installed:
  net-tools-2.0-0.51.20160912git.el8.x86_64                                     

Complete!
Removing intermediate container f7ecade2e25a
 ---> d37dcf6d3fb6
Step 7/10 : EXPOSE 80
 ---> Running in 8345ea0cbfc2
Removing intermediate container 8345ea0cbfc2
 ---> a4d0c5f4c818
Step 8/10 : CMD echo MYPATH
 ---> Running in ec4321339933
Removing intermediate container ec4321339933
 ---> fcecaec0b0cf
Step 9/10 : CMD echo " ~ ~ ~ end ~ ~ ~ "
 ---> Running in edbba0ef11bd
Removing intermediate container edbba0ef11bd
 ---> 1276d020e5dc
Step 10/10 : CMD /bin/bash
 ---> Running in 6c684095a302
Removing intermediate container 6c684095a302
 ---> e7171d8d341f
Successfully built e7171d8d341f
Successfully tagged geekcentos:1.0
[geek@192 docker_my]$
  • 可以進入使用。
[geek@192 docker_my]$ sudo docker run -it geekcentos:1.0
[root@aebce65180c4 local]# pwd
/usr/local
[root@aebce65180c4 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@aebce65180c4 local]# vim test
[root@aebce65180c4 local]#


docker history。鏡像構建詳情。

[geek@192 docker_my]$ sudo docker history geekcentos:1.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
e7171d8d341f        5 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
1276d020e5dc        5 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
fcecaec0b0cf        5 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
a4d0c5f4c818        5 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B                  
d37dcf6d3fb6        5 minutes ago       /bin/sh -c yum -y install net-tools             22.8MB              
18140b90867c        6 minutes ago       /bin/sh -c yum -y install vim                   57.2MB              
82fe516a0098        6 minutes ago       /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
8f16e7d0dee3        6 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
59e173e7c4d0        6 minutes ago       /bin/sh -c #(nop)  MAINTAINER geek<YifanLiGe…   0B                  
0d120b6ccaa8        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB
[geek@192 docker_my]$ sudo docker history mysql:5.7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
ef08065b0a30        2 weeks ago         /bin/sh -c #(nop)  CMD ["mysqld"]               0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 3306 33060            0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B                  
<missing>           2 weeks ago         /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B                 
<missing>           2 weeks ago         /bin/sh -c #(nop) COPY file:7cbb26bbdb8e71b3…   13.2kB              
<missing>           2 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B                  
<missing>           2 weeks ago         /bin/sh -c {   echo mysql-community-server m…   313MB               
<missing>           2 weeks ago         /bin/sh -c echo "deb http://repo.mysql.com/a…   55B                 
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.31-…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0B                  
<missing>           2 weeks ago         /bin/sh -c set -ex;  key='A4A9406876FCBD3C45…   2.61kB              
<missing>           2 weeks ago         /bin/sh -c apt-get update && apt-get install…   52.2MB              
<missing>           2 weeks ago         /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B                  
<missing>           2 weeks ago         /bin/sh -c set -eux;  savedAptMark="$(apt-ma…   4.17MB              
<missing>           2 weeks ago         /bin/sh -c #(nop)  ENV GOSU_VERSION=1.12        0B                  
<missing>           2 weeks ago         /bin/sh -c apt-get update && apt-get install…   9.34MB              
<missing>           2 weeks ago         /bin/sh -c groupadd -r mysql && useradd -r -…   329kB               
<missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:e7407f2294ad23634…   69.2MB


CMD & ENTRYPOINT。

  • CDM
    容器啓動時要運行的命令。只有最後一個會生效,可被替代。
  • ENTRYPOINT
    容器啓動時要運行的命令。可追加命令。
[geek@192 docker_my]$ sudo vim dockerfile-cmd-test
[sudo] password for geek: 
[geek@192 docker_my]$ cat dockerfile-cmd-test 
from centos
cmd ["ls", "-a"]

[geek@192 docker_my]$ sudo docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  4.096kB
Step 1/2 : from centos
 ---> 0d120b6ccaa8
Step 2/2 : cmd ["ls", "-a"]
 ---> Running in f65d2334921a
Removing intermediate container f65d2334921a
 ---> 8c37ba39e701
Successfully built 8c37ba39e701
Successfully tagged cmdtest:latest
  • 執行,命令生效。
[geek@192 docker_my]$ sudo docker run 8c37ba39e701
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
  • 加命令參數,報錯。
[geek@192 docker_my]$ sudo docker run 8c37ba39e701 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.

// 需要完整命令。

[geek@192 docker_my]$ sudo docker run 8c37ba39e701 ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Sep 27 12:15 dev
drwxr-xr-x.   1 root root  66 Sep 27 12:15 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Aug  9 21:40 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 129 root root   0 Sep 27 12:15 proc
dr-xr-x---.   2 root root 162 Aug  9 21:40 root
drwxr-xr-x.  11 root root 163 Aug  9 21:40 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Sep 27 05:38 sys
drwxrwxrwt.   7 root root 145 Aug  9 21:40 tmp
drwxr-xr-x.  12 root root 144 Aug  9 21:40 usr
drwxr-xr-x.  20 root root 262 Aug  9 21:40 var
  • ENTRYPOINT。

容器啓動時要運行的命令。可追加命令。- ENTRYPOINT
容器啓動時要運行的命令。可追加命令。

[geek@192 docker_my]$ sudo vim dockerfile-cmd-entrypoint
[geek@192 docker_my]$ cat dockerfile-cmd-entrypoint 
from centos

entrypoint ["ls", "-a"]

[geek@192 docker_my]$ sudo docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon   5.12kB
Step 1/2 : from centos
 ---> 0d120b6ccaa8
Step 2/2 : entrypoint ["ls", "-a"]
 ---> Running in 49dd42d79208
Removing intermediate container 49dd42d79208
 ---> 5f296513ccf5
Successfully built 5f296513ccf5
Successfully tagged entrypoint-test:latest

[geek@192 docker_my]$ sudo docker run 5f296513ccf5
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
  • 追加命令參數。
[geek@192 docker_my]$ sudo docker run 5f296513ccf5 -l
total 0
drwxr-xr-x.   1 root root   6 Sep 27 12:20 .
drwxr-xr-x.   1 root root   6 Sep 27 12:20 ..
-rwxr-xr-x.   1 root root   0 Sep 27 12:20 .dockerenv
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Sep 27 12:20 dev
drwxr-xr-x.   1 root root  66 Sep 27 12:20 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Aug  9 21:40 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 129 root root   0 Sep 27 12:20 proc
dr-xr-x---.   2 root root 162 Aug  9 21:40 root
drwxr-xr-x.  11 root root 163 Aug  9 21:40 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Sep 27 05:38 sys
drwxrwxrwt.   7 root root 145 Aug  9 21:40 tmp
drwxr-xr-x.  12 root root 144 Aug  9 21:40 usr
drwxr-xr-x.  20 root root 262 Aug  9 21:40 var


製作 Tomcat Dokerfile。

  • 準備 tomcat 和 jdk 壓縮包。
  • 編寫 dockerfile 文件。官方命名 Dockerfile。build 會自動尋找這個文件,就不需要 -f 指定文件了。
[geek@192 tools_my]$ sudo vim Dockerfile
[sudo] password for geek: 
[geek@192 tools_my]$ cat Dockerfile
from centos
maintainer geek<YifanLiGeek@gmail.com>

copy readme.txt /usr/local/readme.txt

add jdk-8u241-linux-x64.tar.gz /usr/local
add apache-tomcat-9.0.38.tar.gz /usr/local

run yum -y install vim

env MYPATH /usr/local
workdir $MYPATH

env JAVA_HOME /usr/local/jdk1.8.0_241
env CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
env CATALINA_HOME /usr/local/apache-tomcat-9.0.38
env CATALINA_BASE /usr/local/apache-tomcat-9.0.38
env PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

expose 8080

cmd /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.38/bin/logs/catalina.out
[geek@192 docker_my]$ sudo docker build -t diytomcat .
Sending build context to Docker daemon  205.8MB
Step 1/15 : from centos
 ---> 0d120b6ccaa8
Step 2/15 : maintainer geek<YifanLiGeek@gmail.com>
 ---> Using cache
 ---> 59e173e7c4d0
Step 3/15 : copy readme.txt /usr/local/readme.txt
 ---> eb47195826b2
Step 4/15 : add jdk-8u241-linux-x64.tar.gz /usr/local
 ---> 867538925102
Step 5/15 : add apache-tomcat-9.0.38.tar.gz /usr/local
 ---> c497c5c1cb19
Step 6/15 : run yum -y install vim
 ---> Running in baa59aed44d6
CentOS-8 - AppStream                            2.8 MB/s | 5.8 MB     00:02    
CentOS-8 - Base                                 518 kB/s | 2.2 MB     00:04    
CentOS-8 - Extras                               4.1 kB/s | 8.1 kB     00:02    
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.el8         AppStream       48 k
 which               x86_64      2.21-12.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        113 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 143 kB/s |  48 kB     00:00    
(3/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  1.4 MB/s | 1.4 MB     00:00    
(4/5): which-2.21-12.el8.x86_64.rpm              84 kB/s |  49 kB     00:00    
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm    4.2 MB/s | 6.3 MB     00:01    
--------------------------------------------------------------------------------
Total                                           2.8 MB/s | 7.8 MB     00:02     
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY                                                                       
CentOS-8 - AppStream                            1.3 MB/s | 1.6 kB     00:00                                   
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"                                    
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D                                               
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial                                                     
Key imported successfully                                                                                     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : which-2.21-12.el8.x86_64                               1/5 
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/5 
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/5 
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5 
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5 
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5 
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5 
  Verifying        : which-2.21-12.el8.x86_64                               5/5 

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64    
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64             

Complete!
Removing intermediate container baa59aed44d6
 ---> 52f81092e768
Step 7/15 : env MYPATH /usr/local
 ---> Running in 757ab2fde799
Removing intermediate container 757ab2fde799
 ---> ee4a54d9e1b5
Step 8/15 : workdir $MYPATH
 ---> Running in fceb9a3b8308
Removing intermediate container fceb9a3b8308
 ---> a23a98e63f82
Step 9/15 : env JAVA_HME /usr/local/jdk1.8.0_241
 ---> Running in fd4863abcc08
Removing intermediate container fd4863abcc08
 ---> 13ebbd91349c
Step 10/15 : env CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in 3c6aaf9174ad
Removing intermediate container 3c6aaf9174ad
 ---> bbe127f3db64
Step 11/15 : env CATALINA_HOME /usr/local/apache-tomcat-9.0.38
 ---> Running in 5beccdaec8bc
Removing intermediate container 5beccdaec8bc
 ---> b624ffaf2a6c
Step 12/15 : env CATALINA_BASE /usr/local/apache-tomcat-9.0.38
 ---> Running in de92ff94de61
Removing intermediate container de92ff94de61
 ---> 7e9ffb9ea42d
Step 13/15 : env PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in 2c02db50f557
Removing intermediate container 2c02db50f557
 ---> 8df2f1efd106
Step 14/15 : expose 8080
 ---> Running in a203cd3bf0ee
Removing intermediate container a203cd3bf0ee
 ---> a815a675b1af
Step 15/15 : cmd /usr/local/apache-tomcat-9.0.38/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.38/bin/logs/catalina.out
 ---> Running in 643d2ac55eb6
Removing intermediate container 643d2ac55eb6
 ---> 0ea70d093e7b
Successfully built 0ea70d093e7b
Successfully tagged diytomcat:latest
[geek@192 docker_my]$ sudo docker run -d -p 9090:8080 --name geektomcat -v /home/geek/build/tomcat/test:/usr/local/apache-tomcat-9.0.38/webapps/test -v /home/geek/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.38/logs diytomcat
[sudo] password for geek: 
584bfb4a1c2720abf4bf590b714f66a5c55c3a6c71d59355ab83f833bef9ea5e


發佈鏡像。

[geek@192 ~]$ sudo docker login --help
[sudo] password for geek: 

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username
[geek@192 ~]$ sudo docker login -u lyfgeek
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[geek@192 ~]$ sudo docker push diytomcat

sudo docker push geek/diytomcat

docker push 如果已存在會自動覆蓋嗎_ide_11



發佈到阿里雲鏡像。



Docker 網絡。

docker0。

sudo docker run -d -P --name tomcat01 tomcat

[geek@192 ~]$ sudo docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

虛擬機可以 ping 通。

[geek@192 ~]$ ping -c 3 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.736 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.059 ms

--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.058/0.284/0.736/0.319 ms

每啓動一個 docker 容器,docker 就會給 docker 容器分配一個 ip,我們只要安裝了 docker,就會有一個網卡 docker0。

橋接模式。使用的是 `veth-pair`` 技術。

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:8d:5f:fb:08 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8dff:fe5f:fb08/64 scope link 
       valid_lft forever preferred_lft forever
  • 每啓動一個容器後,會多一個網卡。

容器內網卡。

[geek@192 ~]$ sudo docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

宿主機網卡。

37: vethfa29654@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether f6:0f:41:f3:ec:7b brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::f40f:41ff:fef3:ec7b/64 scope link 
       valid_lft forever preferred_lft forever

有對應關係。37 ~ 36。

veth-pair 就是成對的虛擬設備接口,ta 們都是成對出現,一端連接着協議,一端連接彼此。

OpenStack,OVS,Docker 容器之間的連接都是使用 veth-pair 技術。

sudo docker run -d -P --name tomcat01 tomcat
sudo docker exec -it tomcat01 ip addr

sudo docker run -d -P --name tomcat02 tomcat
sudo docker exec -it tomcat02 ip addr

[geek@192 ~]$ sudo docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever



[geek@192 ~]$ sudo docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
  • 宿主機。
[geek@192 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a7:c5:64 brd ff:ff:ff:ff:ff:ff
    inet 192.168.142.161/24 brd 192.168.142.255 scope global noprefixroute dynamic ens33
       valid_lft 5429865sec preferred_lft 5429865sec
    inet6 fe80::be3c:cd3d:4ef4:38c4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:8d:5f:fb:08 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8dff:fe5f:fb08/64 scope link 
       valid_lft forever preferred_lft forever
5: veth454806f@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 9a:f7:79:94:a6:d6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::98f7:79ff:fe94:a6d6/64 scope link 
       valid_lft forever preferred_lft forever
37: vethfa29654@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether f6:0f:41:f3:ec:7b brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::f40f:41ff:fef3:ec7b/64 scope link 
       valid_lft forever preferred_lft forever
39: veth2e9ce8c@if38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether a2:1b:35:6a:27:84 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::a01b:35ff:fe6a:2784/64 scope link 
       valid_lft forever preferred_lft forever

共用一個路由器 docker0。

docker push 如果已存在會自動覆蓋嗎_Docker_12

172.17.0.3/16

11111111.11111111.11111111.11111111

255.255.255.255

16 ~ 在 255.255. 下是同一網段。

可以分配 255.255.0.1 ~ 255.255.255.254 個 ip。

docker push 如果已存在會自動覆蓋嗎_docker_13

Docker 中所有的網絡接口都是虛擬的。虛擬的轉發效率高。



問題:mysql 容器 ip 不固定的情況下,ip 換了,怎麼通過名字訪問容器。

–link。
[geek@192 ~]$ sudo docker exec -it tomcat01 ping tomcat02
[sudo] password for geek: 
ping: tomcat02: Name or service not known
  • 通過 --link 指定需要連通的容器。
[geek@192 ~]$ sudo docker run -d -P --name tomcat03 --link tomcat02 tomcat
f21254e5bf8ae2faa8c1ebe1216386f3af7c3990cba24d27b86ef07816d145a9
[geek@192 ~]$ sudo docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.4) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.4): icmp_seq=1 ttl=64 time=1.78 ms
64 bytes from tomcat02 (172.17.0.4): icmp_seq=2 ttl=64 time=0.496 ms
64 bytes from tomcat02 (172.17.0.4): icmp_seq=3 ttl=64 time=0.117 ms

反向不能 ping 通。

sudo docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known



docker network。
[geek@192 ~]$ sudo docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[geek@192 ~]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
76de49ccecf8        bridge              bridge              local
ec29149b6a96        host                host                local
d9c358e6c89b        none                null                local
[geek@192 ~]$ sudo docker network inspect 76de49ccecf8
[
    {
        "Name": "bridge",
        "Id": "76de49ccecf840b34c1d0987998bd1639c6d7c73aa10b948638b7a530ef01ede",
        "Created": "2020-09-27T14:05:02.258994481+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0cc1df6854e9381778be9c1498fe684fa495642f6558f469dd9496931eaa3abc": {
                "Name": "mysql_geek",
                "EndpointID": "bab4b6ec511d42a16a73420a88c46fb80b67b4b6a81743946be2fc131bd247bf",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "97b0a19224b49e4d69b47ba00e14d63dc97318ecd1c7b0efbde291efc35be1d3": {
                "Name": "tomcat02",
                "EndpointID": "503d85c5335b1cc8c9e4f333b557394e9f05b5d2f9616bc3a833cba6f54549ff",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "b03c201ac7a98ca9bfd37c5ae9102d3f7a4ebb71ebc16e120cd8b2d334ae67d1": {
                "Name": "tomcat01",
                "EndpointID": "840ec23feb39efc4b04f61ed6f5038141a665a818a881517ecefac309f82b59e",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "f21254e5bf8ae2faa8c1ebe1216386f3af7c3990cba24d27b86ef07816d145a9": {
                "Name": "tomcat03",
                "EndpointID": "5387febc652ae42927d7d606116daaa28afb39eb34250478a74366244eb790db",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

本質:其實是修改了 host。

[geek@192 ~]$ sudo docker exec -it tomcat03 cat /etc/hosts
[sudo] password for geek: 
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4      tomcat02 97b0a19224b4
172.17.0.5      f21254e5bf8a


自定義網絡 ~ docker network。
  • 查看 docker 所有網絡。
[geek@192 ~]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
76de49ccecf8        bridge              bridge              local
ec29149b6a96        host                host                local
d9c358e6c89b        none                null                local
  • 網絡模式。

–net=bridge ~ 橋接 docker(默認)。在 Docker 網橋 docker0 上為容器創建新的網絡棧。

–net=none ~ 不配置網絡,用户可以稍後進入容器,自行配置。

–net=host ~ 和宿主機共享網絡。

–net=container:name/id ~ 容器網絡連通。(用的少,侷限很大)。容器和另外一個容器共享 network namespace。kubernetes 中的 pod 就是多個容器共享一個 network namespace。

–net=host ~ 容器和宿主機共享 Network namespace。

-net=自定義網絡 ~ 用户自定義。用户自己使用 network 相關命令定義網絡。創建容器時可以指定為自己定義的網絡。

[geek@192 ~]$ sudo docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

sudo docker run -d -P --name tomcat01 tomcat

默認 --net bridge。

==

sudo docker run -d -P --name tomcat01 --net bridge tomcat

[geek@192 ~]$ sudo docker network create --help

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which copying the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment

docker0 網絡的特點。

ta 是默認的。
域名訪問不通。
–link 域名可通,但是刪了又不行。



自己創建一個 Docker network。

sudo docker network create --driver bridge --gateway 192.169.0.1 --subnet 192.168.0.0/16

[geek@192 ~]$ sudo docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
effcb11190c0f0a9ee2db7787a3fe8394461632fc9501d8930fe388ebeb851c1
[geek@192 ~]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
76de49ccecf8        bridge              bridge              local
ec29149b6a96        host                host                local
effcb11190c0        mynet               bridge              local
d9c358e6c89b        none                null                local

–subnet 192.168.0.0/16

192.168.0.2 ~ 192.168.255.254

[geek@192 ~]$ sudo docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "effcb11190c0f0a9ee2db7787a3fe8394461632fc9501d8930fe388ebeb851c1",
        "Created": "2020-09-28T01:06:52.989259998+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[geek@192 ~]$ sudo docker run -d -P --name tomcat-net-01 --net mynet tomcat
e3d0ec74cce10653f1a5e93c81c5abf4cea12254f0bf3c6e7191ef913fa8ba7f
[geek@192 ~]$ sudo docker run -d -P --name tomcat-net-02 --net mynet tomcat
015335e5c354fdaaac3ece68cbaf395308a6099fdcf634c95596ebe306be9dce
[geek@192 ~]$ sudo docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "effcb11190c0f0a9ee2db7787a3fe8394461632fc9501d8930fe388ebeb851c1",
        "Created": "2020-09-28T01:06:52.989259998+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "015335e5c354fdaaac3ece68cbaf395308a6099fdcf634c95596ebe306be9dce": {
                "Name": "tomcat-net-02",
                "EndpointID": "b22b0b26623404ab255ec2f1836acc527444f17ee5df00ce06985e9212198d32",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "e3d0ec74cce10653f1a5e93c81c5abf4cea12254f0bf3c6e7191ef913fa8ba7f": {
                "Name": "tomcat-net-01",
                "EndpointID": "f469d5a66c629bcd47f21351be9422100a5089cfaf82b92ea72e2b9eaf20ec06",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
  • 可以通過容器名 ping。
[geek@192 ~]$ sudo docker exec -it tomcat-net-01 ping 192.168.0.1 -c 3
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.065 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.061/0.063/0.065/0.009 ms
[geek@192 ~]$ sudo docker exec -it tomcat-net-01 ping tomcat-net-02 -c 3
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.074 ms

--- tomcat-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 0.069/0.080/0.097/0.012 ms

tomcat-net-02 也可以 ping 通 tomcat-net-01。



網絡連通。

[geek@192 ~]$ sudo docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[geek@192 ~]$ sudo docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

docker push 如果已存在會自動覆蓋嗎_docker_14

  • 將 tomcat01 和 mynet 連通。
[geek@192 ~]$ sudo docker network connect mynet tomcat01
[geek@192 ~]$ sudo docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "effcb11190c0f0a9ee2db7787a3fe8394461632fc9501d8930fe388ebeb851c1",
        "Created": "2020-09-28T01:06:52.989259998+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "015335e5c354fdaaac3ece68cbaf395308a6099fdcf634c95596ebe306be9dce": {
                "Name": "tomcat-net-02",
                "EndpointID": "b22b0b26623404ab255ec2f1836acc527444f17ee5df00ce06985e9212198d32",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "b03c201ac7a98ca9bfd37c5ae9102d3f7a4ebb71ebc16e120cd8b2d334ae67d1": {
                "Name": "tomcat01",
                "EndpointID": "3625c6b09b4b667a7bc5b3f5a4361c978434047dd3c78600420e594f59410ee3",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
            "e3d0ec74cce10653f1a5e93c81c5abf4cea12254f0bf3c6e7191ef913fa8ba7f": {
                "Name": "tomcat-net-01",
                "EndpointID": "f469d5a66c629bcd47f21351be9422100a5089cfaf82b92ea72e2b9eaf20ec06",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[geek@192 ~]$ sudo docker exec -it tomcat01 ping tomcat-net-01 -c 3
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.110 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.091 ms

--- tomcat-net-01 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.091/0.108/0.124/0.016 ms


Redis 集羣。

sudo docker rm -f $(docker ps -aq)

[geek@192 ~]$ sudo docker network create redis --subnet 172.38.0.0/16
0f4542f770770adbebf8b22b90d0296018c026e649525a8a181f16152f667200
for port in $(seq 1 6)
do
mkdir -p /home/geek/geek/mydata/redis/node-${port}/conf
touch /home/geek/geek/mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /home/geek/geek/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-announce-ip 172.38.0.1${port}
cluster-announce-bus-port 16379
appendonly yes
EOF
done

sudo docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /home/geek/geek/mydata/redis/node-1/data \
-v /home/geek/geek/mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

sudo docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /home/geek/geek/mydata/redis/node-2/data \
-v /home/geek/geek/mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

sudo docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /home/geek/geek/mydata/redis/node-3/data \
-v /home/geek/geek/mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

sudo docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /home/geek/geek/mydata/redis/node-4/data \
-v /home/geek/geek/mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

sudo docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /home/geek/geek/mydata/redis/node-5/data \
-v /home/geek/geek/mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

sudo docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /home/geek/geek/mydata/redis/node-6/data \
-v /home/geek/geek/mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.12 redis-server /etc/redis/redis.conf

  • 創建集羣。

先進入一個容器。

[geek@192 ~]$ sudo docker exec -it redis-1 /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

[geek@192 ~]$ sudo docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf

redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.
0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: dcb8f253dfc1aed54ec272fb2f569034ea5e245a 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 77f3c8bdde5f660c723a60db52429adda8aa11ec 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 16396919eb468bea0b696c7d6c34bf797f7e93f6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 95bdaf227cc3538d276d34d9ad48f97f26aab022 172.38.0.14:6379
   replicates 16396919eb468bea0b696c7d6c34bf797f7e93f6
S: 2a42a4c3c0a5c8a1456cceabf55c323240c18297 172.38.0.15:6379
   replicates dcb8f253dfc1aed54ec272fb2f569034ea5e245a
S: 6902fb44092969a94c7a503559bad6cf9ec07a65 172.38.0.16:6379
   replicates 77f3c8bdde5f660c723a60db52429adda8aa11ec
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: dcb8f253dfc1aed54ec272fb2f569034ea5e245a 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 77f3c8bdde5f660c723a60db52429adda8aa11ec 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 16396919eb468bea0b696c7d6c34bf797f7e93f6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 2a42a4c3c0a5c8a1456cceabf55c323240c18297 172.38.0.15:6379
   slots: (0 slots) slave
   replicates dcb8f253dfc1aed54ec272fb2f569034ea5e245a
S: 95bdaf227cc3538d276d34d9ad48f97f26aab022 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 16396919eb468bea0b696c7d6c34bf797f7e93f6
S: 6902fb44092969a94c7a503559bad6cf9ec07a65 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 77f3c8bdde5f660c723a60db52429adda8aa11ec
[OK] All nodes agree about slots configuration.
>>> Check for open slots...                                                                                   
>>> Check slots coverage...
[OK] All 16384 slots covered.
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:76
cluster_stats_messages_pong_sent:82
cluster_stats_messages_sent:158
cluster_stats_messages_ping_received:77
cluster_stats_messages_pong_received:76
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:158
127.0.0.1:6379> cluster nodes
77f3c8bdde5f660c723a60db52429adda8aa11ec 172.38.0.12:6379@16379 master - 0 1601231683259 2 connected 5461-10922
16396919eb468bea0b696c7d6c34bf797f7e93f6 172.38.0.13:6379@16379 master - 0 1601231684266 3 connected 10923-16383
2a42a4c3c0a5c8a1456cceabf55c323240c18297 172.38.0.15:6379@16379 slave dcb8f253dfc1aed54ec272fb2f569034ea5e245a 0 1601231684000 5 connected
dcb8f253dfc1aed54ec272fb2f569034ea5e245a 172.38.0.11:6379@16379 myself,master - 0 1601231682000 1 connected 0-5460
95bdaf227cc3538d276d34d9ad48f97f26aab022 172.38.0.14:6379@16379 slave 16396919eb468bea0b696c7d6c34bf797f7e93f6 0 1601231683000 4 connected
6902fb44092969a94c7a503559bad6cf9ec07a65 172.38.0.16:6379@16379 slave 77f3c8bdde5f660c723a60db52429adda8aa11ec 0 1601231685275 6 connected
127.0.0.1:6379> set name geek
-> Redirected to slot [5798] located at 172.38.0.12:6379
OK
172.38.0.12:6379>


Spring Boot 微服務打包 Docker 鏡像。

將寫好的項目 mvn package。

確保可以正常運行。

java -jar docker-demo-0.0.1-SNAPSHOT.jar
FROM java:8

COPY *.jar app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

將 jar 包和 Dockefile 拷貝到服務器。

[geek@192 idea]$ sudo docker build -t geek666 .
Sending build context to Docker daemon  16.55MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/5 : COPY *.jar app.jar
 ---> c542b682ce04
Step 3/5 : CMD ["--server.port=8080"]
 ---> Running in cb4fe318aea1
Removing intermediate container cb4fe318aea1
 ---> 56b4e4949967
Step 4/5 : EXPOSE 8080
 ---> Running in ee4e4c67f8b1
Removing intermediate container ee4e4c67f8b1
 ---> 8e87d7c0c35c
Step 5/5 : ENTRYPOINT ["java", "-jar", "app.jar"]
 ---> Running in 447e82f763aa
Removing intermediate container 447e82f763aa
 ---> 72b4682c244c
Successfully built 72b4682c244c
Successfully tagged geek666:latest
[geek@192 idea]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
geek666             latest              72b4682c244c        33 seconds ago      660MB

sudo docker run -d -P --name geek-springboot-web geek666

[geek@192 idea]$ sudo docker run -d -P --name geek-springboot-web geek666
511bbf57ef45b8cb6b2a34227d556e98ced8dabcecc3e9af5bdee88635dad29d
[geek@192 idea]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
511bbf57ef45        geek666             "java -jar app.jar -…"   5 seconds ago       Up 4 seconds        0.0.0.0:32778->8080/tcp   geek-springboot-web
  • 正常訪問。
[geek@192 idea]$ curl localhost:32778
{"timestamp":"2020-09-27T20:12:38.150+00:00","status":404,"error":"Not Found","message":"","path":"/"}
[geek@192 idea]$ curl localhost:32778/hello
hello, geek.
[geek@192 idea]$
# 指定基礎鏡像。
FROM ubuntu:16.04
# 配置環境變量,JDK 的安裝目錄。
ENV JAVA_DIR=/usr/local

# 拷貝 jdk 和 java 項目的包。
COPY ./jdk-8u241-linux-x64.tar.gz $JAVA_DIR/
COPY ./docker-demo-0.0.1-SNAPSHOT.jar /tmp/app.jar

# 安裝 JDK。
RUN cd $JAVA_DIR \
 && tar -xf ./jdk-8u241-linux-x64.tar.gz \
 && mv ./jdk1.8.0_241 ./java8

# 配置環境變量。
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口。
EXPOSE 8090

# 入口,java 項目的啓動命令。
ENTRYPOINT java -jar /tmp/app.jar
FROM java:8

COPY *.jar app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar