安装Docker
安装包下载地址:https://download.docker.com/mac/stable/Docker.dmg ,和安装Mac普通应用一样,下载 dmg 安装包,运行安装包,把应用移动到应用程序目录即可。
官方文档:https://docs.docker.com/docker-for-mac/ 。
本文使用的版本:

Docker加速器
因为 Docker 镜像仓库是在国外的,国内访问速度慢。在安装镜像之前,推荐使用国内 Docker 加速器。
右键屏幕右上角 Docker 图标,选择 Preferences - Daemon ,在 Registry mirrors 里添加:http://docker.mirrors.ustc.edu.cn/
。然后点击 Apply & Restart 按钮,等待 Docker 重新启动即可生效。

常用命令
帮助列表
1 |
docker --help |
可以列出 Docker 所有命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
➜ ~ docker --help Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/Users/feng/.docker") -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 "/Users/feng/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/Users/feng/.docker/cert.pem") --tlskey string Path to TLS key file (default "/Users/feng/.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 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. |
镜像常用命令
查看镜像
1 |
docker images |
我这里是新安装的 Docker ,所以还没有任何镜像。

REPOSITORY:镜像名称
TAG:镜像标签,一般是版本
IMAGE ID:镜像ID
CREATED:镜像的创建日期
SIZE:镜像大小
搜索镜像
1 |
docker search 镜像名称 |

NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否是官方镜像
AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的
拉取镜像
1 |
docker pull 镜像名称:标签 |
如果不指定 TAG ,则使用默认 TAG ,这里我安装一个 nginx 。

再使用查看镜像命令,则能看到列表中有我们刚安装的 nginx 镜像。

删除镜像
按镜像 ID 删除镜像
1 |
docker rmi 镜像ID |

删除所有镜像
1 |
docker rmi `docker images -q` |
容器常用命令
查看容器
查看所有容器
1 2 3 |
docker ps -a 或 docker container ls -a |
查看正在运行的容器
1 2 3 |
docker ps 或 docker container ls |
查看最后一次运行的容器
1 |
docker ps -l |
查看停止的容器
1 |
docker ps -f status=exited |
目前还没有运行任何容器

创建启动容器
创建容器
1 |
docker run |
参数:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加上-it这两个参数,容器创建就能登录进去,即分配一个伪终端。
--name:为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是容器内映射到宿主机上的目录。映射后操作宿主机的目录,就相当于操作容器的目录。宿主机就是安装 Docker 的机器),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录,如果只加 -i -t 两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射
比如创建一个端口为 80 的 nginx 容器:
1 |
docker run -d -p 80:80 --name web 2bcb04bdb83f nginx -g "daemon off;" |

打开浏览器,访问成功则说明 nginx 容器创建并运行成功

停止与启动容器
停止运行容器
1 |
docker stop 容器名称或容器ID |

停止 web 容器后,使用 docker ps
查看运行中的容器,是没有 web 容器的,表示停止成功。
使用 docker ps -a
查看所有容器,可以看到 web 容器的信息,包括停止时间。
启动容器
1 |
docker start 容器名称或容器ID |

删除容器
删除容器之前需要先停止容器。
1 |
docker rm 容器名称或容器ID |

容器文件拷贝
从宿主机拷贝到容器中
1 |
docker cp 宿主机目录 容器名称:容器目录 |
在本地文件创建一个 test.txt 文本,里面就一个 test ,然后拷贝到 web 容器中 nginx 默认的站点目录,打开浏览器测试。

从容器中拷贝到宿主机
1 |
docker cp 容器名称:容器目录 宿主机目录 |

目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
1 |
docker run -d -p 80:80 -v /Users/feng/test:/usr/share/nginx/html --name web 2bcb04bdb83f nginx -g "daemon off;" |
我们在本地创建一个目录,并在创建容器的时候和容器中的指定目录映射。我们就可以在映射后的本地目录或容器目录中做出任意修改,这两个目录会同步。

查看容器信息
1 |
docker inspect web |
会显示出 web 容器的所有信息,非常长
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
[ { "Id": "a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83", "Created": "2019-04-06T07:50:08.444122631Z", "Path": "nginx", "Args": [ "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 3841, "ExitCode": 0, "Error": "", "StartedAt": "2019-04-06T07:50:09.042999427Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c", "ResolvConfPath": "/var/lib/docker/containers/a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83/resolv.conf", "HostnamePath": "/var/lib/docker/containers/a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83/hostname", "HostsPath": "/var/lib/docker/containers/a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83/hosts", "LogPath": "/var/lib/docker/containers/a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83/a702076e3c2fccacf19b54e1f38c972fa14c92046a2778139a0208743b2cde83-json.log", "Name": "/web", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": [ "/Users/feng/test:/usr/share/nginx/html" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "80" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "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, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "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/d497e140240fb250e3301241a82d3b032592f50d4a0108990d79931ab137c4bd-init/diff:/var/lib/docker/overlay2/ce39629dc230fc5aa58b83b3d907670d82a8dce3c1be6b1504418d8a388521c1/diff:/var/lib/docker/overlay2/b186c2f70c05fb0cbcb68adcfaff9e3d46073478b0739679ca4db32740e3b57c/diff:/var/lib/docker/overlay2/6a3547ae022a8f993860d512d0240ab7ddbc8985f0b37f83a78c32fbd651ef05/diff", "MergedDir": "/var/lib/docker/overlay2/d497e140240fb250e3301241a82d3b032592f50d4a0108990d79931ab137c4bd/merged", "UpperDir": "/var/lib/docker/overlay2/d497e140240fb250e3301241a82d3b032592f50d4a0108990d79931ab137c4bd/diff", "WorkDir": "/var/lib/docker/overlay2/d497e140240fb250e3301241a82d3b032592f50d4a0108990d79931ab137c4bd/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/Users/feng/test", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "a702076e3c2f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.15.10-1~stretch", "NJS_VERSION=1.15.10.0.3.0-1~stretch" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "Image": "2bcb04bdb83f", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGTERM" }, "NetworkSettings": { "Bridge": "", "SandboxID": "c843f6ab3bd5d942db98b9c5e3c7375729ddfb0df89144b2097e1752273fa86e", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "80" } ] }, "SandboxKey": "/var/run/docker/netns/c843f6ab3bd5", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "671880ae3e9e6b72bc4a2cdf58230c22ab3a0d11d9de283b9d5bfe3899d931b1", "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": "ff58cf562f784298ad3d117ef9b6f64fe5713430fb3f5ad74b438b94b33ab881", "EndpointID": "671880ae3e9e6b72bc4a2cdf58230c22ab3a0d11d9de283b9d5bfe3899d931b1", "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 } } } } ] |
使用 --format 来过滤信息,注意格式
1 |
docker inspect --format='{{.NetworkSettings.IPAddress}}' web |

常用应用部署
MySQL部署
拉取 MySQL 镜像
1 |
docker pull mysql |
搜索 mysql ,找到自己想要拉取的镜像

创建 mysql 容器(名字随意,我这里和镜像名同名了),宿主机的 33306 端口和容器的 3306 端口映射,并且设置 root 账户的密码。
1 |
docker run -di --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql |

测试连接 MySQL ,注意主机和端口。主机是宿主机的ip,因为我们本机就是宿主机,则默认 localhost 即可。端口号则是宿主机和容器映射的端口号。

Tomcat部署
拉取 Tomcat 镜像
1 |
docker pull tomcat:7-jre8 |
这里 TAG 是 7-jre8 ,表示 Tomcat 大版本是 7 ,jre 大版本是8。

创建 Tomcat 容器,映射端口和目录,如果本机不存在这的目录,会自动创建。
1 |
docker run -di --name=tomcat -p 9000:8080 -v /Users/feng/webapps:/usr/local/tomcat/webapps tomcat:7-jre8 |

我们部署一个 jenkins.war
在 webapps 目录下

测试访问

部署 Nginx
我们之前测试的过程中,已经下载过 Nginx 镜像,我们直接使用之前的镜像进行部署,并映射80端口。
1 |
docker run -di --name=nginx -p 80:80 nginx |
Nginx 默认安装目录在 /ect/nginx 下,我们可以进入容器中对 Nginx 进行配置。

部署 Redis
安装并运行 Redis 容器,端口保持默认的映射。
1 |
docker run -di --name=redis -p 6379:6379 redis |

使用 Redis 客户端测试连接, Redis 默认是没有密码的,所以留空。

备份与迁移
容器转成镜像,可以把容器里所有内容都保存下来,通过镜像备份当做模板发给其他人或者其他电脑使用。
这里的 redis 是指容器名称, redis_image 为保存后的镜像名称。
1 |
docker commit redis redis_image |

镜像备份
1 |
docker save -o redis_image.tar redis_image |

镜像恢复与迁移
1 |
docker load -i redis_image.tar |

这样,我们就可以使用此镜像创建容器了。
注意:删除镜像前,需要先删除通过此镜像创建的容器。
可视化管理Docker
常用的 Docker 可视化工具有 portainer 、 rancher 等,这里我们使用 portainer ,因为 rancher 只支持 Linux 系统的 Docker 宿主机。
拉取 portainer 镜像
1 |
docker pull portainer/portainer |
安装并运行 portainer 。
1 |
docker run -di --name=portainer --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer |
创建容器时一定要加映射 -v /var/run/docker.sock:/var/run/docker.sock
。
然后打开浏览器,输入:http://localhost:9000
,第一次打开需要设置密码,如果是本地单机则选择 Local ,集群则选择 Remote 。
