安装Docker
安装包下载地址:http://download.docker.com/mac/stable/Docker.dmg ,和安装Mac普通应用一样,下载 dmg 安装包,运行安装包,把应用移动到应用程序目录即可。
官方文档:http://docs.docker.com/docker-for-mac/ 。
本文使用的版本:
Docker加速器
因为 Docker 镜像仓库是在国外的,国内访问速度慢。在安装镜像之前,推荐使用国内 Docker 加速器。
右键屏幕右上角 Docker 图标,选择 Preferences - Daemon ,在 Registry mirrors 里添加:http://docker.mirrors.ustc.edu.cn/
。然后点击 Apply & Restart 按钮,等待 Docker 重新启动即可生效。
常用命令
帮助列表
docker --help
可以列出 Docker 所有命令
➜ ~ 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.
镜像常用命令
查看镜像
docker images
我这里是新安装的 Docker ,所以还没有任何镜像。
REPOSITORY:镜像名称
TAG:镜像标签,一般是版本
IMAGE ID:镜像ID
CREATED:镜像的创建日期
SIZE:镜像大小
搜索镜像
docker search 镜像名称
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否是官方镜像
AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的
拉取镜像
docker pull 镜像名称:标签
如果不指定 TAG ,则使用默认 TAG ,这里我安装一个 nginx 。
再使用查看镜像命令,则能看到列表中有我们刚安装的 nginx 镜像。
删除镜像
按镜像 ID 删除镜像
docker rmi 镜像ID
删除所有镜像
docker rmi `docker images -q`
容器常用命令
查看容器
查看所有容器
docker ps -a
或
docker container ls -a
查看正在运行的容器
docker ps
或
docker container ls
查看最后一次运行的容器
docker ps -l
查看停止的容器
docker ps -f status=exited
目前还没有运行任何容器
创建启动容器
创建容器
docker run
参数:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加上-it这两个参数,容器创建就能登录进去,即分配一个伪终端。
--name:为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是容器内映射到宿主机上的目录。映射后操作宿主机的目录,就相当于操作容器的目录。宿主机就是安装 Docker 的机器),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录,如果只加 -i -t 两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射
比如创建一个端口为 80 的 nginx 容器:
docker run -d -p 80:80 --name web 2bcb04bdb83f nginx -g "daemon off;"
打开浏览器,访问成功则说明 nginx 容器创建并运行成功
停止与启动容器
停止运行容器
docker stop 容器名称或容器ID
停止 web 容器后,使用 docker ps
查看运行中的容器,是没有 web 容器的,表示停止成功。
使用 docker ps -a
查看所有容器,可以看到 web 容器的信息,包括停止时间。
启动容器
docker start 容器名称或容器ID
删除容器
删除容器之前需要先停止容器。
docker rm 容器名称或容器ID
容器文件拷贝
从宿主机拷贝到容器中
docker cp 宿主机目录 容器名称:容器目录
在本地文件创建一个 test.txt 文本,里面就一个 test ,然后拷贝到 web 容器中 nginx 默认的站点目录,打开浏览器测试。
从容器中拷贝到宿主机
docker cp 容器名称:容器目录 宿主机目录
目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
docker run -d -p 80:80 -v /Users/feng/test:/usr/share/nginx/html --name web 2bcb04bdb83f nginx -g "daemon off;"
我们在本地创建一个目录,并在创建容器的时候和容器中的指定目录映射。我们就可以在映射后的本地目录或容器目录中做出任意修改,这两个目录会同步。
查看容器信息
docker inspect web
会显示出 web 容器的所有信息,非常长
[
{
"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 来过滤信息,注意格式
docker inspect --format='{{.NetworkSettings.IPAddress}}' web
常用应用部署
MySQL部署
拉取 MySQL 镜像
docker pull mysql
搜索 mysql ,找到自己想要拉取的镜像
创建 mysql 容器(名字随意,我这里和镜像名同名了),宿主机的 33306 端口和容器的 3306 端口映射,并且设置 root 账户的密码。
docker run -di --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
测试连接 MySQL ,注意主机和端口。主机是宿主机的ip,因为我们本机就是宿主机,则默认 localhost 即可。端口号则是宿主机和容器映射的端口号。
Tomcat部署
拉取 Tomcat 镜像
docker pull tomcat:7-jre8
这里 TAG 是 7-jre8 ,表示 Tomcat 大版本是 7 ,jre 大版本是8。
创建 Tomcat 容器,映射端口和目录,如果本机不存在这的目录,会自动创建。
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端口。
docker run -di --name=nginx -p 80:80 nginx
Nginx 默认安装目录在 /ect/nginx 下,我们可以进入容器中对 Nginx 进行配置。
部署 Redis
安装并运行 Redis 容器,端口保持默认的映射。
docker run -di --name=redis -p 6379:6379 redis
使用 Redis 客户端测试连接, Redis 默认是没有密码的,所以留空。
备份与迁移
容器转成镜像,可以把容器里所有内容都保存下来,通过镜像备份当做模板发给其他人或者其他电脑使用。
这里的 redis 是指容器名称, redis_image 为保存后的镜像名称。
docker commit redis redis_image
镜像备份
docker save -o redis_image.tar redis_image
镜像恢复与迁移
docker load -i redis_image.tar
这样,我们就可以使用此镜像创建容器了。
注意:删除镜像前,需要先删除通过此镜像创建的容器。
可视化管理Docker
常用的 Docker 可视化工具有 portainer 、 rancher 等,这里我们使用 portainer ,因为 rancher 只支持 Linux 系统的 Docker 宿主机。
拉取 portainer 镜像
docker pull portainer/portainer
安装并运行 portainer 。
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 。