目录
Docker
1.安装
https://www.runoob.com/docker/docker-tutorial.html
各个版本都有自行查看
2.docker镜像加速
从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器
- Docker官方提供的中国镜像库:https://registry.docker-cn.com
- 七牛云加速器:https://reg-mirror.qiniu.com
上面网址也有加速教程
centos下的步骤:
1.vim /etc/docker/daemon.json
添加:
{"registry-mirrors":["https://registry.docker-cn.com"]}
2.重启:
sudo systemctl daemon-reload
sudo systemctl restart docker
3.检测:
docker info
3.1 镜像相关命令
-
查看镜像:docker image
-
搜索镜像:docker search 镜像名称
-
拉取镜像:docker pull 镜像名称
-
删除镜像:docker rmi 镜像ID
删除所有的镜像:docker rmi
docker images -q
3.2 容器相关命令
-
查看正在运行的容器:docker ps
-
查看所有容器:docker ps -a
-
查看最后一次运行的容器:docker ps -l
-
查看停止容器:docker ps -f status=exited
-
创建容器常用参数说明:
-i 表示运行容器
-t 表示容器启动后进入其命令行
加入这两个参数后,容器创建就能登陆进去了
-name 表示为创建的容器命名
-v 表示目录映射关系(前者是宿主目录后者是映射到宿主机上的目录),最好做目录映射,在宿主机上修改,然后共享到容器上
-d 在run后面加上 -d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i,-t两个参数,创建后就会自动进去容器)
-p 表示端口映射 前者是宿主机端口,后者是容器内端口
-
交互式创建容器:
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
可以通过docker ps查看
exit 可以退出当前容器
-
守护式创建容器:
docker run -di --name=容器名称 镜像名称:标签
登陆守护式容器的方式:
docker exec -it 容器名称(或者容器ID)/bin/bash
3.3 停止与启动容器
-
启动容器:
docker start 容器名称(或者容器ID)
-
停止容器:
docker stop 容器名称(或者容器ID)
3.4 文件拷贝
-
拷贝到容器:
docker cp file_path 容器名称:容器内path
-
从容器拷贝:
docker cp 容器名称:容器目录 save_file_path
3.5 目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器
详情看-v 参数
docker run -di -v /user/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果挂在的是多级目录,可能会出现权限不足的提示。
这时因为centos7中安全模块把权限禁掉了,需要添加参数 --privileged=true来解决挂在的目录没有权限的问题
3.6 查看容器ip
docker inspect 容器名称(容器ID)
3.7删除容器
删除指定容器:docker rm 容器名称(容器ID)
4.1 mysql部署
1.拉取mysql镜像:
docker pull centos/mysql-57-centos7
2.创建容器:
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-e 表示的是添加环境变量 ,MYSQL_ROOT_PASSWORD是root用户的登录密码
3.进入mysql容器:
docker exec -it ten square_mysql /bin/bash
4.登陆mysql
mysql -u root -p
5.远程登陆
4.2 tomcat 部署
1.拉取镜像
docker pull tomcat:7-jre7
2.创建容器
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
4.3 Nginx 部署
1.拉取镜像
docker pull nginx
2.创建容器:
docker run -di --name=mynginx -p 80:80 nginx
4.4 redis部署
1.拉取镜像
docker pull redis
2.创建容器:
docker run -di --name=myredis -p 6379:6379 redis
5.1 容器保存为镜像
通过以下命令将容器保存为镜像
docker commit mynginx mynginx_i
5.2 镜像备份
通过以下命令将镜像保存为tar文件
docker save -o mining.tar mynginx_i
5.3 镜像恢复与迁移
为了演示,先删除mynginx_img镜像,然后执行以下命令恢复:
docker load -i mynginx.tar
-i 表示输入的文件
执行后再次查看docker ps可看到镜像已经恢复
6.1 Dockerfile简介
dockerfile是由一系列命令和参数构成的脚本,这些命令应用与基础镜像并最终创建一个新的镜像
- 对于开发人员,可以为开发团队提供一个完全一致的开发环境
- 对于测试人员,可以直接拿开发时所构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作
- 对于运维人员,在部署时,可以实现应用的无缝移植
6.2 dockerfile常用命令
-
FROM image_name:tag
定义了使用哪个基础镜像启动构建流程
-
MAINTAINER user_name
声明镜像的创建者
-
ENV key value
设置环境变量,可以写多条
-
RUN command
是dockerfile的核心部分,可以写多条
-
ADD source_dir/file/dest_dir/file
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
-
COPY source_dir/file/dest_dir/file
和ADD相似,但是如果有压缩文件并不能解压
-
WORKDIR path_dir
设置工作目录
6.3 docker-compose介绍
docker-compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景(集群,快速编排)。
6.4 docker-compose常用命令
-
docker-compose --version
产看docker-compose版本 -
步骤
编写Dockerfile,编写docker-compose.yml,执行docker-compose命令 -
常用命令
如果命令后不指定服务名称,则针对yml文件,如果写了具体名称,只针对单个服务。3.1 docker-compose build
构建容器3.2 docker-compose up -d
构建并启动容器3.3 docker-compose down
停止并销毁容器 -
例子
Dockerfile文件有如下内容:
docker-compose.yml文件有如下内容:
参数解释:(注意:缩进)
version:版本有1,2,3,目前多用2
service:指定构建的镜像或容器
eureka-serverl1/2为容器名称
build:指定Dockerfile路径
ports:暴露端口(建议写为- "7666:7666",如果纯数字,小于60的端口会解析错误)
mem_limit:容器的内存大小
networks:提前创建好的网络
在docker-coompose.yml文件夹下执行
docker-compose up
7.1 docker私有仓库
1.拉取私有仓库镜像
docker pull registry
2.启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
3.打开浏览器输入地址 http://192.168.184.141:5000/v2/_catalog 看到 {“repositories”:[ ]}表示私有仓库搭建成功并且内容为空
4.修改daemon.json文件
vim /etc/docker/daemon.json
添加以下内容:
{“insecure-registries”:[“192.168.184.141:5000”]}
用于让docker信任私有仓库地址
5.重启docker服务
systemctl restart docker
7.2 镜像上传至私有仓库
1.标记此镜像为私有仓库镜像
docker tag jdk1.8 192.168.184.141:5000/jdk1.8
2.上传标记的镜像
Docker push 192.168.184.141:5000/jdk1.8
8.1 networks命令
- 查看网卡信息
ifconfig
docker0为虚拟网桥,ip是172.17.0.1,掩码是255.255.0.0也就是/16。
作用:
- 容器间的互联和通信以及端口映射
- 容器IP变动时可以通过服务名直接进行网络通信而不受到影响
- 常用命令
- 新增:(create)
docker network create van # 创建名为van网络,默认为bridge
- 删除:(rm,purne)
docker network rm van# 删除单个网络
docker network purne #删除所有无用的网络
- 查看:(ls)
docker network ls
docker network ls --no-trunc # 显示完整的网络ID
docker network ls --filter driver=bridge # 驱动程序过滤器根据驱动程序匹配网络。以下示例将网络与桥驱动程序相匹配
docker network ls --filterr id =xxx # 匹配网络ID的全部或部分。需要注意以下自己的ID
docker network ls --format "{{.ID}}: {{.Driver}}" # 这里使用不带标题的模板,并输出用冒号分隔所有网络的ID和驱动程序条目
- 查看网络数据源(inspect)
docker network inspect bridge # 查看网络数据源
- 网络连接(connect,disconnect)
- 作用:
用于将容器连接到网络。可以按名称或ID连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。
# 将正在运行的容器连接到网络
docker network connect 网络名 正在运行的容器
# 启动时将容器连接到网络
docker run -itd --network=网络名 即将启动的容器
# 指定容器的IP地址
docker network connect --ip 10.10.10.10 网络名 容器
# 强制断开容器的网络连接
docker network disconnect 网络名 容器
8.2 networks模式
- bridge
#为每一个容器分配、设置IP等,并将容器连接到docker0的虚拟网桥。若没有特别申明,则为默认自带一个IP以及网络设置。(一人一个)
--network bridge #没有进行特殊申明的话默认为docker0
- host
#容器不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。(多人一个)
--network host
- none
# 容器有自己独立的Network namespace,但是没有进行任何的相关配置。(有,但是空的)
--network none
- container
#新创建的容器不会创建自己的网卡,没有自己的IP,也不会进行相应的配置。而是和一个指定的容器共享IP端口范围等。(自己没有,用别人的)
--network container:[容器名或容器ID]
- 自定义网络
如果在启动容器时,不定义network(假设默认是bridge),容器的ip是docker0的网段,虽然两个容器的ip在同一网段,也能通过ip ping通,但是ip会动态变动(一般正式环境不允许把ip写死),所以需要通过容器名ping通,但如果不对容器指定相同的网络,那么就不能通过容器名(服务名)ping通。
下面是指定自定义网络的步骤:
docker network create van_network
docker run -d -p 8081:8080 --network van_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network van_network --name tomcat82 billygoo/tomcat8-jdk8
#进入tomcat81,查看ip
docker exec -it tomcat81 bash
ip add
#进入tomcat82,查看ip
docker exec -it tomcat82 bash
ip add
#此时,因为使用了自定义网络,ping容器名(服务名)就可以ping通
ping tomcat81
ping tomcat82
#自定义网络本身就维护好了主机名和IP的对应关系,也就是IP和域名都能联通