# Docker ```bash #方法一 系统默认源 #安装docker sudo apt-get --no-install-recommends install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get --no-install-recommends install -y docker-ce docker-ce-cli containerd.io #获取权限: sudo groupadd docker sudo usermod -aG docker $USER #安装docker-compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose #安装其他依赖 sudo apt install -y curl redis-server python3-dev python3-venv libldap2-dev libsasl2-dev sudo apt install python3-setuptools sudo pip install setuptools ``` ```bash #方法二 官方源 # 参考官网 https://docs.docker.com/engine/install/ubuntu/ # 更新源 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release # 添加GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加仓库源 # x86_64/amd64 echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # arm64 # echo \ "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 列出仓库源可安装版本 apt-cache madison docker-ce #安装特定版本 =5:20.10.6~3-0~ubuntu-bionic sudo apt-get install docker-ce= docker-ce-cli= containerd.io #验证安装 sudo docker run -it --rm hello-world ``` ```bash #国内源(阿里源) #卸载旧版本 #sudo apt-get remove docker docker-engine docker.io sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io #启动Docker sudo systemctl enable docker sudo systemctl start docker ``` ```bash #使用脚本自动安装 # curl -fsSL test.docker.com -o get-docker.sh curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun # sudo sh get-docker.sh --mirror AzureChinaCloud ``` ## Docker加速镜像源 ```bash # Docker国内加速源 systemctl cat docker | grep '\-\-registry\-mirror' sudo vim /etc/docker/daemon.json { "registry-mirrors": [ "https://8iihlf4m.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://registry.docker-cn.com" ] } ``` ```bash #Windows桌面版配置 cd "C:\Program Files\Docker\Docker" DockerCli.exe -SwitchDaemon ``` ## docker用户组权限 ```bash # 添加docker用户组 sudo groupadd docker # 将当前用户添加入docker用户组 sudo usermod -aG docker ${USER} # 重启docker服务 sudo systemctl restart docker #切换用户 su root su ${USER} ``` ## 镜像image ```bash ## 拉取 #从Docker 镜像仓库获取镜像, 命令格式 docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] # Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io) #仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像 #docker pull ubuntu:18.04 ##运行 docker run -it --rm #docker run -it --rm ubuntu:18.04 bash ##列出镜像 docker image ls docker image ls -a docker image ls -q #列ID ##查看镜像详细信息 docker inspect docker history --no-trunc ##镜像体积 docker system df ##删除虚悬镜像 docker image prune ##删除本地镜像 docker image rm [选项] <镜像1> [<镜像2> ...] #<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要 ##例子 docker run --name webserver -d -p 80:80 nginx #用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器 ##commit(慎用) docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] #当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。 ``` ## 容器container ```bash #启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(exited)的容器重新启动。 ##新建容器并启动 docker run docker run ubuntu:18.04 /bin/echo 'Hello world' # Hello world docker run -t -i ubuntu:18.04 /bin/bash #进入容器 docker run -it --name ubuntu18.04 ubuntu:18.04 # 命名容器 #选项 --add-host=[] #指定主机到IP地址的映射关系,格式为host:ip --dns=[] #为容器指定域名服务器 -h #为容器指定主机名 -i #打开容器的标准输入 -t #为容器分配一个命令行虚拟终端 -d #创建的容器在后台运行 --name #指定容器的名称 -u, --user= 创建用户 ##启动已终止容器 docker container start docker container start ##守护态运行,后台运行 -d docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" #输出结果可以用 docker logs 查看 ##列出守护态容器 docker container ls ##列出容器 docker ps ##终止 docker container stop docker container ls -a #终止状态的容器可以用 docker container ls -a 命令看到 docker container start #重新启动 ##进入容器 #在使用 -d 参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐使用 docker exec 命令 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69d137adef7a ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds zealous_swirles $ docker exec -i 69d1 bash ##导出容器 docker export #docker export 7691a814370e > ubuntu.tar ##导入容器 docker import #cat ubuntu.tar | docker import - test/ubuntu:v1.0 ##删除容器 docker container rm #docker container rm trusting_newton ##清理所有处于终止状态的容器 docker container prune ``` ## 仓库repository ```bash #导出镜像为文件 docker save -o file_name.tar image_name #从文件导入镜像 docker load --input file_name.tar #或者 docker load < file_name ##拉取镜像 #通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地 docker search centos docker pull centos ##推送镜像 #用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub docker tag ubuntu:18.04 username/ubuntu:18.04 docker image ls docker push username/ubuntu:18.04 docker search username ##自动构建 #登录 Docker Hub; #在 Docker Hub 点击右上角头像,在账号设置(Account Settings)中关联(Linked Accounts)目标网站; #在 Docker Hub 中新建或选择已有的仓库,在 Builds 选项卡中选择 Configure Automated Builds; #选取一个目标网站中的项目(需要含 Dockerfile)和分支; #指定 Dockerfile 的位置,并保存 ##私有仓库 Docker Registry docker run -d -p 5000:5000 --restart=always --name registry registry ``` ## 网络管理 不管宿主机是什么系统,Dockers安装后都会在宿主机中创建一个虚拟网桥,通过该虚拟网桥实现容器之间以及容器和外部网络的连接。通常情况虚拟网桥的名称为`docker0`。网桥将网络中多个网段在数据链路层连接起来。 ```bash #查看虚拟网桥 ip link show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eno1: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether f0:2f:74:af:eb:e3 brd ff:ff:ff:ff:ff:ff 3: docker0: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:06:34:a3:c4 brd ff:ff:ff:ff:ff:ff 4: br-ca7b5f25bc18: mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:1d:09:37:a3 brd ff:ff:ff:ff:ff:ff 6: vethbe82f8f@if5: mtu 1500 qdisc noqueue master br-ca7b5f25bc18 state UP mode DEFAULT group default link/ether 06:2b:e9:7a:18:42 brd ff:ff:ff:ff:ff:ff link-netnsid 2 8: vethd3fd2ba@if7: mtu 1500 qdisc noqueue master br-ca7b5f25bc18 state UP mode DEFAULT group default link/ether e6:51:cb:6e:13:86 brd ff:ff:ff:ff:ff:ff link-netnsid 0 10: vethb8121a5@if9: mtu 1500 qdisc noqueue master br-ca7b5f25bc18 state UP mode DEFAULT group default link/ether 12:26:7a:d6:e1:36 brd ff:ff:ff:ff:ff:ff link-netnsid 1 ``` 在Dokcer中,各个容器是通过一个名称为docker0的虚拟网桥实现互连的,该虚拟网桥可以设置IP地址,相当于一个隐藏的虚拟网卡。守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。 docker守护进程在一个容器中启动时,实际上需要创建网络连接的两端。一端是在容器中的网络设备,另一端是在运行docker守护进程的主机上打开一个名为veth*的一个接口,用来实现docker0网桥与容器的网络通信。 ```bash #通过网桥工具包bridge-utils管理网桥 #查看虚拟网桥docker0信息 brctl show ``` ### 网络模式 1、host模式 Docker默认使用命名空间进行资源隔离,包括网络的命名空间。但是如果启动容器时使用`host`模式,那么该容器不会获得一个独立的Network命名空间,而是和宿主机公用一个Network命名空间。容器将不会虚拟出自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。 ```bash #例 docker run -d -it --network=host centos #在容器中查看网络参数 docker exec ip a show #输出结果和宿主机的一致 ``` 2、container模式(容器模式) 这个模式指定新创建的容器和已经存在的一个容器共享一个Network命名空间,而不是和宿主机共享,新创建的容器不会创建新的虚拟网卡、配置IP地址,而是和一个指定的容器共享IP地址、端口范围。同时两个容器除了网络配置其他文件系统和进程列表还是隔离的。 3、none模式(无模式) 这个模式的容器拥有自己的Network命名空间,但是并不为该容器做任何网络配置。也就是这个docker容器没有网卡、IP地址信息。需要我们自己添加配置。 4、bridge模式(桥接模式) 桥接模式是Docker默认的网络配置,该模式会为每个容器分配Network命名空间,配置虚拟网卡和IP地址,并将容器和宿主机的网络统统连接到docker0的网桥上。 ### 容器互连 由于同一宿主机上的所有容器都连接在同一个虚拟网桥docker0上,所以默认同一宿主机上的不同容器之间是可以互连的。