docker下载
清除环境
[root@kimas ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
配置docker yum源
[root@kimas ~]# yum install -y yum-utils
[root@kimas ~]# yum-config-manager --add-repo \ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@kimas ~]# yum install docker-ce docker-ce-cli containerd.io -y
[root@kimas ~]# systemctl start docker
docker阿里云加速
[root@kimas ~]# sudo mkdir -p /etc/docker
[root@kimas ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://o2gubjcl.mirror.aliyuncs.com"]
}
EOF
[root@kimas ~]# sudo systemctl daemon-reload
[root@kimas ~]# sudo systemctl restart docker
docker基本命令
$ docker images #查看主机上所有的镜像 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0d120b6ccaa8 3 months ago 215MB #解释 REPOSITORY #镜像仓库的源 TAG #版本号 IMAGE ID #镜像ID CREATED #镜像的创建时间 SIZE #镜像的大小 #可选项 -a --all #列出所有镜像 -q --quiet #只显示镜像的ID $ docker info #显示docker的系统信息,包括镜像和容器的数量 $ docker version #显示docker的版本信息
docker搜索镜像
$ docker search 名称 #可选项 --filter=stars=3000 #搜索出来的镜像STARS大于3000
docker下载镜像
$ docker pull mysql #下载镜像 docker pull 镜像名[:tag] 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 938c64119969: 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 #docker指定版本下载 $ 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.
docker删除镜像
[root@kimas ~]# docker rmi -f ae0658fdbad5 #删除指定容器的ID
[root@kimas ~]# docker rmi -f 容器ID 容器ID #可删除多个容器ID,空格分开
[root@kimas ~]# docker rmi -f $(docker images -aq) #删除全部的容器
docker容器基本命令
==说明:我们需要有镜像才可以使用容器==
[root@kimas ~]# docker run [可选项] #启动服务
#参数说明
--name="name" #容器名字
-d #后台运行
-it #使用交互方式运行
-p(小写) #指定容器端口
-P(大写) #随机指定端口
[root@kimas ~]# docker run -it centos /bin/bash #交互方式启动并进入容器
[root@25871e2889ad /]# ls #查看容器内的centos,基础版本。很多命令都是不完善的!
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@25871e2889ad /]# exit #退出容器
docker列出运行的容器
$ docker ps #查看当前运行的容器 -a #查看当前运行的容器,但会同历史运行过的一同显示 -n=? #显示最近创建的容器 -q #只显示容器的编号
docker退出容器
$ exit #直接停止,并退出容器 ctrl +p +q #容器不停退出
docker删除容器
$ 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 镜像名 # 问题使用命令docker ps 发现 chentos 停止了。 # 常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
docker查看日志
$ docker logs [可选项] 容器ID #参数说明 -f 跟随日志输出 -t 显示时间戳 --tail 从日志末尾开始显示行数(默认为全部)
查看容器进程信息top
#docker top 容器ID $ docker top 89451929a30c UID PID PPID C STIME TTY TIME CMD root 6050 6034 0 02:50 ? 00:00:00 /bin/bash
查看镜像的元数据
[root@kimas ~]# docker inspect 89451929a30c
[
{
"Id": "89451929a30cf964b8d674c05c0f82eb308eaa84ae53e0cb727a8c6dd6d449bb",
"Created": "2020-11-25T02:29:57.863346784Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
...
...
...
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"0c304e10b0e11e289cdc2f5f5e56ed9973449541639138582738f5f055b8d1b0",
"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 /bin/bash $ docker attach 容器ID #正在执行当前的代码。。。 docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach # 进入容器正在执行的终端,不会开启一个新的终端
从容器拷贝文件到本地服务器
# 命令详解 docker cp 容器ID:源文件 目标路径 $ docker cp a225cc21992f:/usr/share/elasticsearch/test.js /home/
练习
安装nginx
# 搜索nginx $ docker search nginx # 下载nginx 指定版本号下载 nginx:tag $ $ docker pull nginx # 查看镜像是否下载完成 $ docker images # 启动容器 docker run 后台 名字 *** -p指定端口 公网端口:容器端口 启动服务 #指定版本启动 nginx:tag $ docker run -d --name mynginx -p 8080:80 nginx # 服务器内部访问 $ curl localhost:8080
安装tomcat # --rm 前台运行,退出表示删除用完及删除。。这方式不推荐使用 $ docker run -it --rm tomcat:9.0 # 下载镜像 $ docker pull tomcat:9.0 # 启动tomcat docker run 后台 -p指定端口 暴露端口:容器内部端口 --name 镜像名称 启动的容器:tag $ docker run -d -p 3355:8080 --name liutomcat tomcat:9.0 # 进入容器 $ docker exec -it 容器ID /bin/bash
安装es+kibana
# --net somenetwork 网络配置 [root@kimas ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx=512" elasticsearch:tag [root@kimas ~]# curl localhost:9200 { "name" : "a225cc21992f", "cluster_name" : "docker-cluster", "cluster_uuid" : "8NfKMUQNRHC44hxFsGR3_w", "version" : { "number" : "7.9.3", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "c4138e51121ef06a6404866cddc601906fe5c868", "build_date" : "2020-10-16T10:36:16.141335Z", "build_snapshot" : false, "lucene_version" : "8.6.2", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" } [root@kimas ~]# docker stats #查看内存使用率
commit镜像
[root@kimas ~]# docker commit -a="作者名字" -m="描述信息" 容器ID 名称:tag
容器数据卷
使用数据卷
方式一:直接使用命令挂载 -v
[root@kimas ~]# docker run -it -v /home/test:/home centos /bin/bash [root@kimas ~]#docker inspect 5ea95785007c "Mounts": [ #挂载-v卷 { "Type": "bind", "Source": "/home/test", #主机内地址 "Destination": "/home", #docker容器内地址 "Mode": "", "RW": true, "Propagation": "rprivate" } ], #测试文件同步 1.在容器内部/home下创建一个文件 $ docker run -it centos /bin/bash $ cd /home $ touch test 2.在本地服务器/home/test查看存在文件 $ cd /home/test $ cat test #测试 1.停止容器 $ docker stop 容器ID 2.本地服务器/home/test修改文件内容 $ vim /home/test/test 3.启动容器 $ docker start 容器ID 4.检查文件是否同步
实战:安装MySQL
[root@kimas ~]# docker pull mysql:5.7 [root@kimas ~]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 #命令详解 -d 后台运行 -p 端口映射 -v 卷挂载 -e 环境配置 --name 名称
具名和匿名挂载
volume命令详解
$ docker volume [] Commands: create #创建一个卷 inspect #检查在一个或多个卷上显示详细信息 ls #ls列表卷 prune #修剪删除所有未使用的本地卷 rm #rm删除一个或多个卷#匿名挂载 -v 容器内路径! $ docker run -d -P --name nginx01 -v /etc/nginx nginx #查看所有的volume $ docker volume ls #以下情况就是匿名挂载,-v只写了容器内的路径,没有写容器外的路径 DRIVER VOLUME NAME local 1acaf8fcd64270f95e201a33d25944c78b54be5310c91da80bbe540771664e2b local 4c2d2f47a85ee468320945574e1c90cf66d61a92adb5d366f06cda132ecc45ed #具名挂载 $ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #通过-v 卷名:容器内路径 $ docker volume ls #以下这种就是具名挂载 DRIVER VOLUME NAME local juming-nginx $ docker volume inspect juming-nginx #查看卷情况 [ { "CreatedAt": "2020-12-04T14:39:11+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #记录卷的位置 "Name": "juming-nginx", "Options": null, "Scope": "local" } ]所有的docker容器的卷,没有指定目录的情况下都在
/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用
具名挂载
#如何确定是否具名或者匿名,还是指定路径挂载 -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机:容器内路径 #指定路径挂载,已根开始
扩展:
#通过-v 容器内路径,ro rw 改变读写权限 ro readonly #只读 rw readwrite #可读可写 #一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了! # ro权限只能通过宿主机来操作,容器内部是无法操作!默认是rw $ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx $ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx初始dockerfile
dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每一个都是一层。
$ vim /home/dockerfile/dockerfile01 #添加以下内容 FROM centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash$ docker build -f /home/dockerfile/dockerfile01 -t liangzai/centos:1.0 . #命令详解 -f 指定文件 -t 指定名称标记tag版本--volumes-from
容器与容器之间共享
docker run -it --name docker01 liangzai/centos:1.0 docker run -it --name docker02 --volumes-from docker01 liangzai/centos:1.0