Mac下Docker的安装与使用

/ 0评 / 2

安装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 重新启动即可生效。

常用命令

帮助列表

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 。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注