docker入门
docker
1.docker安装
1.1官方文档
https://docs.docker.com/engine/install/
2.Ubuntu安装代码
lsb_release -a //查看版本
apt-get remove docker docker-engine docker.io //卸载旧版docker
uname -r //查看内核
apt-get update //更新apt包资源索引
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common //安装软件包以允许apt通过HTTPS使用存储库
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
//添加Docker的官方密钥
sudo apt-key fingerprint 0EBFCD88 //9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88通过搜索指纹的最后8个字符,确认您现在拥有带指纹的密钥
dpkg --print-architecture //查看本机的系统架构
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable" //-amd64系统架构安装方式,国内安装慢替换源
sudo apt-get update //更新apt软件包索引
sudo apt-get install docker-ce docker-ce-cli containerd.io //安装docker
docker version //查看docker版本
sudo docker run hello-world //测试hello-world
3.卸载docker
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
4.docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档的地址:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地的主机上的镜像
root@WIN-PKAP9TQVR46:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
root@WIN-PKAP9TQVR46:~# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10202 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3753 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 744 [OK]
percona Percona Server is a fork of the MySQL relati… 511 [OK]
# 可选项,通过搜索来过滤
-f, --filter filter Filter output based on conditions provided
root@WIN-PKAP9TQVR46:~# docker search mysql -f=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10202 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3753 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
root@WIN-PKAP9TQVR46:~# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是 latest
latest: Pulling from library/mysql
852e50cd189d: Pull complete # 分层下载,docker image的核心 联合文件系统
29969ddb0ffb: Pull complete
a43f41a44c48: Pull complete
5cdd802543a3: Pull complete
b79b040de953: Pull complete
7689ec51a0d9: Pull complete
a880ba7c411f: Pull complete
984f656ec6ca: Pull complete
9f497bce458a: Pull complete
b9940f97694b: Pull complete
2f069358dc96: Pull complete
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
#等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
root@WIN-PKAP9TQVR46:~# docker pull mysql:5.7
5.7: Pulling from library/mysql
852e50cd189d: Already exists
29969ddb0ffb: Already exists
a43f41a44c48: Already exists
5cdd802543a3: Already exists
b79b040de953: Already exists
938c64119969: Already exists
7689ec51a0d9: Already exists
36bd6224d58f: Pull complete
cab9d3fa4c8c: Pull complete
1b741e1c47de: Pull complete
aac9d11987ac: Pull complete
Digest: sha256:8e2004f9fe43df06c3030090f593021a5f283d028b5ed5765cc24236c2c4d88e
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
root@WIN-PKAP9TQVR46:~# docker rmi -f 镜像id #删除指定的镜像
root@WIN-PKAP9TQVR46:~# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像
root@WIN-PKAP9TQVR46:~# docker rmi -f $(docker images -aq) #删除全部镜像
容器命令
说明:我们有了镜像才开源创建容器,Linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交换方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
# 测试,启动并进入容器
root@WIN-PKAP9TQVR46:~# docker run -it centos /bin/bash
[root@483b35e2942d /]# ls # 查看容器内的centos,基础版本,很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@483b35e2942d /]# exit
exit
root@WIN-PKAP9TQVR46:/# ls
bin dev home lib lib64 lost+found mnt proc run snap sys usr www
boot etc init lib32 libx32 media opt root sbin srv tmp var
列出所有运行的容器
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
root@WIN-PKAP9TQVR46:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@WIN-PKAP9TQVR46:/# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
483b35e2942d centos "/bin/bash" 7 minutes ago Exited (0) 4 minutes ago wizardly_meninsky
10a473430871 hello-world "/hello" 19 hours ago Exited (0) 19 hours ago peaceful_franklin
退出容器
exit # 直接容器停止并退出
ctrl+P+Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器
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@WIN-PKAP9TQVR46:/# docker run -d centos
# 问题docker ps ,发现 centos 停止了
# 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
# nginx, 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -tf 容器,没有日志
# 自己编写一段shell脚本
root@WIN-PKAP9TQVR46:~# docker run -d centos /bin/sh -c "while true;do echo hiro;sleep 1;done"
root@WIN-PKAP9TQVR46:~# docker ps
CONTAINER ID IMAGE
93cca96fe113 centos
# 显示日志
-tf #显示日志
--tail number #要显示日志条数
root@WIN-PKAP9TQVR46:/# docker logs -tf --tail 10 93cca96fe113
2020-11-26T06:23:26.601970400Z hiro
2020-11-26T06:23:27.607620500Z hiro
2020-11-26T06:23:28.613385200Z hiro
2020-11-26T06:23:29.618038600Z hiro
2020-11-26T06:23:30.620873700Z hiro
2020-11-26T06:23:31.627818600Z hiro
2020-11-26T06:23:32.633895100Z hiro
2020-11-26T06:23:33.639897400Z hiro
2020-11-26T06:23:34.645983200Z hiro
2020-11-26T06:23:35.652489300Z hiro
2020-11-26T06:23:36.658586500Z hiro
查看容器中进程信息 ps
# 命令 docker top 容器id
root@WIN-PKAP9TQVR46:/# docker top 93cca96fe113
UID PID PPID C STIME TTY
root 15902 15885 0 14:20 ?
root 16390 15902 0 14:27 ?
查看镜像的元数据
# 命令
docker inspect 容器id
# 测试
root@WIN-PKAP9TQVR46:~# docker inspect 93cca96fe113
[
{
"Id": "93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238",
"Created": "2020-11-26T06:20:28.4013719Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hiro;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 15902,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-11-26T06:20:28.7647445Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238/hostname",
"HostsPath": "/var/lib/docker/containers/93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238/hosts",
"LogPath": "/var/lib/docker/containers/93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238/93cca96fe1138bc48d345fa15de839ece619edda9349e3331e33c066f0316238-json.log",
"Name": "/loving_chaplygin",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"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,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"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,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"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/d97866cfd6fb6651743dd70db48b08839208938bb531e56819157a55dd8b3e60-init/diff:/var/lib/docker/overlay2/db250942f6471948817be402aa9bf68abcad04fd4f03be61c3c6b8fcff01e13a/diff",
"MergedDir": "/var/lib/docker/overlay2/d97866cfd6fb6651743dd70db48b08839208938bb531e56819157a55dd8b3e60/merged",
"UpperDir": "/var/lib/docker/overlay2/d97866cfd6fb6651743dd70db48b08839208938bb531e56819157a55dd8b3e60/diff",
"WorkDir": "/var/lib/docker/overlay2/d97866cfd6fb6651743dd70db48b08839208938bb531e56819157a55dd8b3e60/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "93cca96fe113",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo hiro;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"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": "f5e8cc1e45b3be0adca116fedead72f839b297ed7191596c3dd9c38bcde353b9",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/f5e8cc1e45b3",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "ff045066179fa9f6de7079c4bf4b6979407393a860b3835939bf70938ebd7621",
"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": "2b75c95460b44aa5372118389fb39cc41d921dca3a5e71a938f268ab8dc8b8e9",
"EndpointID": "ff045066179fa9f6de7079c4bf4b6979407393a860b3835939bf70938ebd7621",
"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
}
}
}
}
]
进入当前正在进行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashShell
# 测试
root@WIN-PKAP9TQVR46:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93cca96fe113 centos "/bin/sh -c 'while t…" About an hour ago Up About an hour loving_chaplygin
root@WIN-PKAP9TQVR46:/# docker exec -it 93cca96fe113 /bin/bash
[root@93cca96fe113 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@93cca96fe113 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:20 ? 00:00:04 /bin/sh -c while true;do echo hiro;sleep 1;done
root 4219 0 0 07:31 pts/0 00:00:00 /bin/bash
root 4251 1 0 07:31 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 4252 4219 0 07:31 pts/0 00:00:00 ps -ef
# 方式二
docker attach 容器id
root@WIN-PKAP9TQVR46:/# docker attach 93cca96fe113
正在执行当前的代码...
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程!
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
# 进入docker容器内部
root@WIN-PKAP9TQVR46:/# docker exec -it 93cca96fe113 /bin/bash
[root@93cca96fe113 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@93cca96fe113 /]# cd root
[root@93cca96fe113 ~]# ls
anaconda-ks.cfg anaconda-post.log original-ks.cfg
[root@93cca96fe113 ~]# pwd
/root
# 在容器内新建一个文件
[root@93cca96fe113 ~]# touch test.java
[root@93cca96fe113 ~]# ls
anaconda-ks.cfg anaconda-post.log original-ks.cfg test.java
[root@93cca96fe113 ~]# exit
exit
root@WIN-PKAP9TQVR46:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93cca96fe113 centos "/bin/sh -c 'while t…" About an hour ago Up About an hour loving_chaplygin
# 将这个文件拷贝出来到主机上
root@WIN-PKAP9TQVR46:/# docker cp 93cca96fe113:/root/test.java /home
root@WIN-PKAP9TQVR46:/# cd /home
root@WIN-PKAP9TQVR46:/home# ls
hiro test.java
# 拷贝是一个手动的过程,未来我们使用 -v 卷的技术,可以实现
小结
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实战测试
PS C:\Users\Administrator> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03059979cb6c tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp beautiful_raman
4a225def7ecd alexcheng/magento2:latest "/sbin/my_init" 41 minutes ago Up 41 minutes 0.0.0.0:80->80/tcp magento2
PS C:\Users\Administrator> docker exec -it 03059979cb6c /bin/bash
root@03059979cb6c:/usr/local/tomcat# cd webapps
root@03059979cb6c:/usr/local/tomcat/webapps# ls
root@03059979cb6c:/usr/local/tomcat/webapps# cd ..
root@03059979cb6c:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@03059979cb6c:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@03059979cb6c:/usr/local/tomcat# cd webapps
root@03059979cb6c:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
# 1.启动一个默认的tomcat
# 2.发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的!
# 3.我自己拷贝进去了基本的文件
# 4.将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像