最近公司项目要用docker部署,第一次接触,记录一下,方便使用时查阅。
你有没有遇到过这种情况,在本地运行良好的代码,在另一台电脑或者另一个环境里一堆bug,可以说是水土不服,本质上是两个电脑的运行环境不一样,但是不能每次给到别人都要装一遍运行环境吧,这样很抓狂,这时候docker就横空出世来拯救我们了。docker相当于我们平时使用的虚拟环境,但是它比虚拟环境好,比它轻便,并且可移植,使用起来非常方便。
docker主要有三块内容:仓库(registry)、镜像(image)和容器(container)。理解了这三个内容,相信大家使用起来也没什么问题了。
一、仓库镜像
使用过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还可以不用写全名,只要写前几位,只要能区分就行,比如下面都是删除同一个镜像。
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 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: 绑定一个卷
实例
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.1 的 80 端口上。 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:/#
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" } } ]
4、docker start/stop/restart
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
5、docker rm
删除一个或多少容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] OPTIONS说明: -f :通过SIGKILL信号强制删除一个运行中的容器 -l :移除容器间的网络连接,而非容器本身 -v :-v 删除与容器关联的卷
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
原文:https://www.cnblogs.com/zongfa/p/11295685.html