Docker学习——基本使用

最近公司项目要用docker部署,第一次接触,记录一下,方便使用时查阅。

你有没有遇到过这种情况,在本地运行良好的代码,在另一台电脑或者另一个环境里一堆bug,可以说是水土不服,本质上是两个电脑的运行环境不一样,但是不能每次给到别人都要装一遍运行环境吧,这样很抓狂,这时候docker就横空出世来拯救我们了。docker相当于我们平时使用的虚拟环境,但是它比虚拟环境好,比它轻便,并且可移植,使用起来非常方便。

docker主要有三块内容:仓库(registry)、镜像(image)和容器(container)。理解了这三个内容,相信大家使用起来也没什么问题了。当然最好的教程是它的官方文档了:https://docs.docker.com/engine/reference/run/

 

一、仓库镜像 

使用过github的人应该对仓库不陌生,docker仓库就相当于一个收纳盒,里面有很多官方或者个人上传的镜像,我们要用时只需要从里面拿出来就好了。

1、docker search 

用于查找仓库里的镜像,比如我要用python,那么我就可以用这个命令查看里面已有的python镜像,拿来用即可,一般官方的镜像都是在第一个,如下图中,它是按星标量(stars)来排序的。

2、docker pull [image]

用于从docker仓库中拉取我们需要的镜像到我们本地,不指定版本的话,默认下载的是最新版本,如果我们要python3.7版本,则可以用python:3.7的格式

3、docker push [image]

用于将本地的镜像上传到镜像仓库,要先登陆到镜像仓库才可上传

4、docker login

用于登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

5、docker logout

用于登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

 

二、本地镜像管理 

上面说的是如何操作官方镜像仓库,接下来我们说说本地镜像,比如我们下载了好几个镜像到本地,我们本地也就有了镜像了,就可以以这些镜像为基础做很多事了。

1、docker images

用于查看本地的所有镜像

2、docker rmi 

用于删除本地镜像,后面可以接镜像名,也可以是镜像ID,镜像ID还可以不用写全名,只要写前几位,只要能区分就行,比如下面都是删除同一个镜像。加上-f可强制退出。后面也可以同时接多个镜像,它会一起删除

docker rmi python_v5
docker rmi e1b

3、docker tag

用于标记本地镜像,将其归入某一仓库,相当于重命名。如下图中,执行之后image ID没有变。

4、docker save

用于将指定镜像保存成 tar 归档文件。我们做好的镜像要传给别人一般会保存成tar格式。

docker save [OPTIONS] IMAGE [IMAGE...]

以上两种方式都可以把本地镜像Ubuntu保存为tar文档,然后可以将它们拷贝给别人用了,使用的人怎么导入到自己的docker里呢?

5、docker load

用于导入使用 docker save 命令导出的镜像。以下两种方式都可以。

6、docker export/import

用于将镜像归档为tar文件和从归档文件中创建镜像。刚刚save和load也是这种功能,有什么区别呢?

(1) docker save image-name:  将镜像保存为文件,然后通过docker load再加载回来为一个镜像。会保存该镜像的的所有历史记录,比docker export 导出的文件大,很容易理解,因为save时保存了镜像的所有历史记录。

(2) docker export container-name: 将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

7、docker history

查看指定镜像的创建历史

 

三、容器操作

1、docker run 

创建一个新的容器并运行一个命令,注意Docker容器后台运行,就必须有一个前台进程,主线程结束,容器会退出。所以如果docker run -d image 这样启动容器后,你在用docker ps 往往看不到容器正在运行,其实它启动过,然后马上又停止了,但是如果你给它一个前台进程,它会一直running,即必须有交互。比如用docker run -dit image

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v:    绑定一个卷
View Code
实例
1 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
   docker run --name=mynginx -d nginx:latest
2 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
   docker run -P -d nginx:latest
3 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
  docker run -p 80:80 -v /data:/data -d nginx:latest
4  绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.180 端口上。
  docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
5 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
  ~$ docker run -it nginx:latest /bin/bash
  root@b8573233d675:/# 
6 使用镜像python:v2以后台模式启动一个容器,并运行容器内的/opt/下的hello.py文件
docker run -d 59c /bin/bash -c 'python /opt/hello.py'
7 --restart=always 可以使使我们在重启docker时,自动启动相关容器
docker run -d --restart=always 59c
8 设置开启自启动
docker update --restart=always 容器id

2、docker ps [-a]

查看正在运行的容器,加上-a表示查看所有容器,不管是否在运行。a即all的意思。

3、docker inspect

查看某个镜像或容器信息。

➜  Downloads docker inspect python_v5
[
    {
        "Id": "sha256:e1b27deb648064491092ee935137217b99d4bb69df6cbf67387cbf7f4c58d32c",
        "RepoTags": [
            "python_v5:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "2019-08-01T08:07:31.264992514Z",
        "Container": "6302d3a0173fb32427ca0da36f01623ff84c62db06bdd2bb9096573ec99b7166",
        "ContainerConfig": {
            "Hostname": "6302d3a0173f",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=C.UTF-8",
                "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
                "PYTHON_VERSION=3.7.4",
                "PYTHON_PIP_VERSION=19.1.1"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "830",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "19.03.0",
        "Author": "",
        "Config": {
            "Hostname": "6302d3a0173f",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=C.UTF-8",
                "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
                "PYTHON_VERSION=3.7.4",
                "PYTHON_PIP_VERSION=19.1.1"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "830",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 1178611787,
        "VirtualSize": 1178611787,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/94b14c0267ea97d2e202b03c961a526a5d0e7efa569b369ecaaf5b4a158c6b0f/diff:/var/lib/docker/overlay2/8088e680020134339f3dbebae5e350a7d5289d49c05747194098d5edddb5d320/diff:/var/lib/docker/overlay2/8d6375915ac6b8ac7bab53ea08b7eb4d55ad34983d1571d55c2d2cbfc7e34533/diff:/var/lib/docker/overlay2/1e1a0b9b37457942435da7f36fcc5e9edc537502f5f7bafc6c3f0a306f9fe9b5/diff:/var/lib/docker/overlay2/908161c3a74b133dfa9f64b92263502986a6f4928a35ddb36be66f82c8c450c0/diff:/var/lib/docker/overlay2/f878d6e9110afb24ae50b3cd4ec19add29cf3eeb65f4fc902f0be8121487688c/diff:/var/lib/docker/overlay2/600822aff1d1245171a2d6b4d445c648e8a647baae59d17ab24c06c816030751/diff:/var/lib/docker/overlay2/f5254203568c9d7a82d99756c04d1198d8104a385058cc7d8fa72af1e53b0bbf/diff:/var/lib/docker/overlay2/a253040337dc2660037f2c654d5781a259d98a225ff8777db7ed8eb6e3f4527c/diff:/var/lib/docker/overlay2/78e6b4db4897d7473557fe9700cfdd384703dcee8fe7bee3edb2d65f2fccbf41/diff:/var/lib/docker/overlay2/ff2b9485217fa82eec4461ee662b0bc99aab13625a4f3794c6e7188a6b1cc108/diff:/var/lib/docker/overlay2/e596defbdc38e3c423601d8fc559579012acd5b219447374ed6ea73ca4420560/diff",
                "MergedDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/merged",
                "UpperDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/diff",
                "WorkDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:31b0e148310d3953be8ba9ff530a91424f01688ee604f99cbfb519dab9e8c66d",
                "sha256:46601dcd41143bcf3068c33e6a3c243b91a9887cccc9f2538dd04e0052029db5",
                "sha256:e9313b51f46d907a186066e017c68c9201dbfb858dc862e30ba25f0e1b2ea6b3",
                "sha256:05c027e771c84f989d3014001fb68093d26433d8cdbd8a33ef6a9fb421236ebd",
                "sha256:8c487c756d719a312177878c31e091160a82466c592082f229b81150cabd8891",
                "sha256:a8063b4b5a7d8c0c0f7a4bc3f7ad3b40022fee3e4d80cddc422c035337d63bab",
                "sha256:9c97ad5abfed00d029883bcc6d16f59f0a93d64613f125f6161622589e5adae0",
                "sha256:bf67ef7447f3277d7ad9f21c89386e517ef7400c0e8edd69b613c59d1ad3d907",
                "sha256:0d93f713b4088e1d0121f020642e524965bd88ba808360ce402a94bfa4c33099",
                "sha256:e03d22e105305aefe1cd4cc1888438d35f4cfd1be4201c48812b1f1223ef5fdf",
                "sha256:beaa082ea74ddfd28eeaeb6afe1d9d3c1cfa97f327f62a716915babd7bb8ba95",
                "sha256:e07fc2dcedcb9699d7d275a292fbf2bc012487e723d914147ede6351e4f59980",
                "sha256:c6043ace8fd9e940870be978e72abdfa976bc1513682f24c9b0bf4626da3cc98"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
View Code

4、docker start/stop/restart

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

5、docker rm

删除一个或多少容器,加上-f可强制退出,后面也可以接多个container一起删除

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

-f :通过SIGKILL信号强制删除一个运行中的容器

-l :移除容器间的网络连接,而非容器本身

-v :-v 删除与容器关联的卷
View Code

6、docker create 

创建一个容器但不运行它。

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

7、decker exec

在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:
-d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端

实例

在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

docker exec -it mynginx /bin/sh /root/runoob.sh
http://www.runoob.com/

在容器 mynginx 中开启一个交互模式的终端:

~$ docker exec -i -t  mynginx /bin/bash
root@b1a0703e41e7:/#

8、docker attach

连接到正在运行中的容器。要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕,带上--sig-proxy=false可以确保CTRL-D或CTRL-C不会关闭容器。

docker attach --sig-proxy=false mynginx

9、docker commit

从容器创建一个新的镜像。这个比较实用。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
~$ docker images mymysql:v1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mymysql             v1                  37af1236adef        15 seconds ago      329 MB

10、docker cp

用于容器与主机之间的数据拷贝。我们经常要将写好的代码放入容器中,这个方法就很适用。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp /opt/try  96f7f14e99ab:/home/zzf

11、docker logs

获取容器的日志

docker logs [OPTIONS] CONTAINER

  OPTIONS说明:

  • -f : 跟踪日志输出

  • --since :显示某个开始时间的所有日志

  • -t : 显示时间戳

  • --tail :仅列出最新N条容器日志

 12、docker 启停

# 停止服务
systemctl stop docker 
# 重启服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker

13、Docker DeviceMapper占用空间太大解决方案

  • 问题主要在于原先分配的空间过大导致的,使用“docker info”查看
  • 首先备份需要的容器和镜像,使用“docker save”或者“docker export”.
  • 然后暂停docker;
  • 删除/var/lib/docker目录;
  • 重建目录,空间分配
mkdir -p /var/lib/docker/devicemapper/devicemapper
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
  • 重启docker

 14、如果不想要每次执行docker时都要sudo,可以把用户加入docker的组里:

sudo usermod -aG docker 用户名

然后登出再登陆(也可以通过newgrp docker激活docker组),此时用户执行docker就不需要sudo了。

posted @ 2019-08-04 00:33  理想几岁  阅读(717)  评论(0编辑  收藏  举报