docker学习笔记(一):docker安装及常见命令
【1】下载ubuntu16.04 64位的镜像
注意换源
【2】docker安装
1、卸载旧版本的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
2、更新apt
sudo apt-get update
3、使apt可以通过https使用repository
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
4、添加docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
5、检查GPG key信息是否正确
sudo apt-key fingerprint 0EBFCD88
GPG Key信息如下:
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
6、添加源信息
# 将源信息直接写入/etc/apt/sources.list*
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
7、确认Docker的源信息是否正确, 新的源是否添加成功:
$ sudo apt-cache madison docker-ce
8、安装docker
(1)安装制定版本
列出可用的版本列表信息:
sudo apt-cache madison docker-ce
安装指定版本
sudo apt-get install docker-ce=18.06.3~ce~3-0~ubuntu
(2)安装最新版本
$ sudo apt-get install -y docker-ce
【3】docker换源
在/etc/docker/daemon.json 中写入如下内容(如果文件不存在新建该文件)
中科大的docker源会比较快一点
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
【4】虚拟机 VS docker
虚拟机(模拟一个完整的操作系统)缺点:
- 资源占用很多
- 冗余步骤多
- 启动慢
容器化技术
容器化技术不是一个模拟一个完整的操作系统
容器之间互相隔离
容器直接利用宿主机的内核,也没有虚拟硬件,所以就轻便了吗,每个容器内是相互隔离的,每个容器都有自己的文件系统,互不影响
DevOps:开发、运维
docker是内核级别的虚拟化
【5】docker的基本组成
docker架构图
- 客户端
- 服务器
- 仓库
镜像(image)
docker镜像就好比是一个模板,可以通过这个模板来创建服务,tomcat镜像== >run== > tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或项目运行就是在容器中的)
容器(container)
docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的
启动、停止、删除,基本命令
目前可以把容器理解为一个linux系统
仓库(registry)
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
Dokcer Hub(默认国外)
阿里云都有容器服务器(配置镜像加速)
【6】docker常用网址
docker官网:https://www.docker.com/
docker文档:https://docs.docker.com/
docker仓库:https://hub.docker.com/
【7】回顾helloworld的流程
sudo docker run hello-world
hello-world run的流程图:
底层原理
docker是一个client-server结构的系统
docker的守护进程运行在宿主机上,通过socket从客户端访问
docker-server接收到docker-client的命令,就会执行这个命令
docker为什么比VM快?
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,VM需要guest OS
所以,新建一个系统的时候,docker不需要像VM一样重新加载一个操作系统内核,避免引导,虚拟机是加载guest OS(分钟级别的),而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的
【7】docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令,帮助命令
帮助文档的地址
https://docs.docker.com/reference/
镜像命令
docker images :查看所有本地主机上的镜像
root@gqy:/home/gqy# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的ID
docker search:搜索镜像
root@gqy:/home/gqy# docker search geth
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
gethue/hue Hue is an open source SQL Assistant for Data… 68
blakeberg/geth-node Based on Ubuntu 14.04.4 contains Geth a full… 4 [OK]
ethnode/geth geth image for stats.ethfans.org 1 [OK]
hunterlong/gethexporter Monitor your Geth Ethereum Server with Prome… 1 [OK]
# 可选项,通过收藏来过滤
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
docker search mysql --filter=STARS=3000 #搜索STARS>3000的镜像
docker pull:下载镜像
# 下载镜像 docker pull 镜像名[:tag]
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
docker pull mysql(默认下载最新版)
docker pull mysql:5.7
# 联合文件系统
# 分层文件
docker rmi:删除镜像
docker rmi -f 镜像id #删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部的容器
容器命令
说明:有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="name" #容器名字 tomcat01,tomcat02用来区分容器
-d #以后台方式运行,ja nohup
-it #使用交互方式运行,进入容器查看内容
-p #制定容器的端口 -p 8080:8080
-p 主机ip:宿主机端口:容器端口
-p 宿主机端口:容器端口(常用)
-p 容器端口
容器端口
-P #随机指定端口
#测试,启动并进入容器
root@gqy:/home/gqy# docker run -it centos /bin/bash
[root@5a5245dd430b /]# ls #查看容器内的centos,很多基础命令都不完善
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#从容器中退到宿主机
[root@5a5245dd430b /]# exit
exit
root@gqy:/home/gqy# ls
Desktop Downloads Music Public soft Videos
Documents examples.desktop Pictures snap Templates
列出所有运行的容器
# docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的+带出历史运行过得容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
root@gqy:/home/gqy# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@gqy:/home/gqy# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a5245dd430b centos "/bin/bash" 6 minutes ago Exited (0) 2 minutes ago friendly_haibt
a38e84f6405a hello-world "/hello" 7 hours ago Exited (0) 7 hours ago peaceful_albattani
e63a1c2627c6 hello-world "/hello" 2 days ago Exited (0) 2 days ago clever_mendeleev
退出容器
exit #容器停止并退出
ctrl+p+q #容器不停止并退出
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
常用的其他命令
后台启动容器
# 命令 docker run -d 镜像名
root@gqy:/home/gqy# docker run -d centos
#问题docker ps 发现centos停止
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#ngnix,容器启动后,发现自己没有启动服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail 容器,没有日志
# 自己编写一段shell脚本
root@gqy:/home/gqy# docker run -d centos /bin/sh -c "while true; do echo kuangshen; sleep 1; done"
# root@gqy:/home/gqy# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42777bb418c centos "/bin/sh -c 'while t…" 30 seconds ago Up 29 seconds friendly_heisenberg
# 显示日志
-tf #显示日志
--tail number #显示日志条数
root@gqy:/home/gqy# docker logs -t -f --tail 10 d42777bb418c
查看容器中进程信息 ps
# 命令:docker top 容器id
查看镜像的元数据
# 命令:docker inspect 容器id
# 测试
root@gqy:/home/gqy# docker inspect 68485c114ef3
[
{
"Id": "68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966",
"Created": "2021-01-28T09:04:20.121428395Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-01-28T09:04:20.391754885Z",
"FinishedAt": "2021-01-28T09:07:15.653292453Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966/hostname",
"HostsPath": "/var/lib/docker/containers/68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966/hosts",
"LogPath": "/var/lib/docker/containers/68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966/68485c114ef362a6618a6a0f7e33ab8b6dc8e9422d2cb6524c967c223b288966-json.log",
"Name": "/affectionate_borg",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"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/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/asound",
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f47b6f271bf145fd9a2e2cd2c44ae3488c4d246b84b079a095dc38895ee7d1b4-init/diff:/var/lib/docker/overlay2/a72b81671424a19f3634cf7aac3b561c9ee5167fc5ed375fc18adb5d6a0c1336/diff",
"MergedDir": "/var/lib/docker/overlay2/f47b6f271bf145fd9a2e2cd2c44ae3488c4d246b84b079a095dc38895ee7d1b4/merged",
"UpperDir": "/var/lib/docker/overlay2/f47b6f271bf145fd9a2e2cd2c44ae3488c4d246b84b079a095dc38895ee7d1b4/diff",
"WorkDir": "/var/lib/docker/overlay2/f47b6f271bf145fd9a2e2cd2c44ae3488c4d246b84b079a095dc38895ee7d1b4/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "68485c114ef3",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "b46026033de6691fe3c8c5264a1e7bf8877a475667d48e65468ddbc987c4b6b2",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/b46026033de6",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "fccfee78b2d2e286258939c428ab6531c51473be21d7111fbfd199aa5c62fb45",
"EndpointID": "",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
}
]
进入当前正在运行的容器
docker exec -it 容器id bashShell
docker attach 容器id
# 我们通常容器都是使用后台方式运行,需要进入容器,修改一些配置
# 方式一
# 命令 docker exec -it 容器id bashShell
# 测试
root@gqy:/home/gqy# docker exec -it 8cf3b290bb89 /bin/bash
[root@8cf3b290bb89 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@8cf3b290bb89 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:15 ? 00:00:00 /bin/sh -c while true; do echo kuangshen; sleep 1; done
root 99 0 0 04:17 pts/0 00:00:00 /bin/bash
root 140 1 0 04:17 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 141 99 0 04:17 pts/0 00:00:00 ps -ef
# 方式二
# 命令 docker attach 容器id
# 测试
root@gqy:/home/gqy# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8cf3b290bb89 centos "/bin/sh -c 'while t…" 4 minutes ago Up 4 minutes ecstatic_babbage
root@gqy:/home/gqy# docker attach 8cf3b290bb89
kuangshen
kuangshen
kuangshen
kuangshen
# docker exec 进入容器后开启一个新的终端,可以在里面操作
# docker attach 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到宿主机
# 命令
# docker cp 容器id:容器内路径 目的主机路径(从容器到目的主机:常用docker cp命令)
# docker cp 目的主机路径 容器id:容器内路径(从目的主机到容器:常用卷挂载)
# 测试
# 进入docker容器内部
root@gqy:/home/gqy# docker attach 68485c114ef3
[root@68485c114ef3 /]# cd home
# 在容器内新建一个文件
[root@68485c114ef3 home]# docker attach test.java
[root@68485c114ef3 home]# exit
exit
# 将这个文件拷贝出来到主机上
root@gqy:/home/gqy# docker cp 68485c114ef3:/home/test.java /home
root@gqy:/home# ls -al
total 12
drwxr-xr-x 3 root root 4096 2月 5 12:34 .
drwxr-xr-x 24 root root 4096 1月 30 11:39 ..
drwxr-xr-x 24 gqy gqy 4096 2月 5 11:26 gqy
-rw-r--r-- 1 root root 0 1月 28 17:07 test.java
# 拷贝是一个手动过程,未来使用-v卷的技术,可以实现自动同步
小结
docker help—检查最新 Docker 可用命令;
docker attach—将本地输入、输出、错误流附加到正在运行的容器;
docker commit—从当前更改的容器状态创建新镜像;
docker exec—在活动或正在运行的容器中运行命令;
docker history—显示镜像历史记录;
docker info—显示系统范围信息;
docker inspect—查找有关 docker 容器和镜像的系统级信息;
docker login—登录到本地注册表或 Docker Hub;
docker pull—从本地注册表或 Docker Hub 中提取镜像或存储库;
docker ps—列出容器的各种属性;
docker restart—停止并启动容器;
docker rm—移除容器;
docker rmi—删除镜像;
docker run—在隔离容器中运行命令;
docker search—在 Docker Hub 中搜索镜像;
docker start—启动已停止的容器;
docker stop—停止运行容器;
docker version—提供 docker 版本信息。
docker的命令是十分多的,上面学习的都是最常用的容器和镜像的命令,之后还会学习一些命令