一、Dcoker的基本信息
- 虚拟机和容器的区别
虚拟机是操作系统级别、容器是进程级别。虚拟机启动时间分钟级别、容器是秒级别、都是为了发布
Docker是一个开源的容器的引擎
Docker是相互隔离
Docker工作原理
docker分为两部分是C/S结构
一部分是docker客户端
一部分是docker守护线程
首先通过守护进程看有没有镜像、有就创建一个容器、没有就去远程仓库拉取镜像再创建容易
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nM8LPwK2-1617235923355)(https://myorther.oss-cn-shenzhen.aliyuncs.com/IQN3G%29P4%40FG84JI%7E%28R3%40_66.png?Expires=1616670512&OSSAccessKeyId=TMP.3KjthptfhJRNsvnZ5ZVbhZeq9e11bUCktZLoBeXoHC9J7xAFRiEc3LDMf7hw62CsMdji1RVAALbkoNmJTNatkKcRRkxSvV&Signature=eaSlTKduaD7O4ly%2BGtdE5BtWGO0%3D)]
二、安装Docker
- 安装Docker依赖
yum -y install yum-utils device-mapper-persistent-data lvm2
- 指定docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
在 /etc/yum.repos.d 下有一个docker-ce.repo文件里面指定了docker版本
安装Docker
重新加载repo文件
yum makacache fast
安装
yum -y install docker-ce
查看是否装好 docker info(客户端好了,服务端需要启动)
- 修改为阿里云镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnCU6NJb-1617235923362)(F:\mypic\aliyun.png)]
将此段代码直接复制到linux命令行中去
- 启动Docker
systemctl start docker 或者开机启动 ststemctl enable docker
- 寻找镜像并通过一个镜像跑起来
docker search mysql(要找的镜像)
或者去官方去找https://www.docker.com/
创建容器 docker run --name zoukx-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --name 容器名字:zoykx-mysql -p 3306(宿主机):3306(容器) -e 参数为root MYSQL_ROOT_PASSWORD=root -d 后台运行 mysql:5.7镜像和版本
首先会去本地找,没有的话就会自动去远程找
停止容器 docker stop 161e4f2d44(容器ID)
删除容器 docker rm -f 161e4f2d44
容器装好了可以直接访问 比如下好了mysql镜像并创建了容器可以通过sqlyong通过ip直接连接
docker run --name zoukx-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 一个容器:通过访问宿主机ip:3306访问容器zoukx-mysql docker run --name zoukx-mysql99 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 一个容器:通过访问宿主机ip:3307访问容器zoukx-mysql999
一个宿主机的一个进程对应一个容器
三、和镜像的命令
- 查询本地所有镜像
docker images
- 拉取镜像
docker pull 镜像名[版本(不加默认是最后的版本)]
- 删除镜像
docker rmi 镜像ID (没有跑容器的时候才能删掉) docker rmi -f 镜像ID 强制删除
- 修改镜像名称
docker tag 镜像ID 修改后的名字:1.0(版本)
- 查询镜像
docker search hell/mysql/...
四、和容器有关的命令
运行容器
最简单的 docker run 镜像:版本
进入容器 docker exec -it 容器ID bash 退出容器 exit docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像名称/镜像标识[:版本] -d:后台运行 -p 宿主机和容器对应的端口 --name 容器名称 -e 环境参数 如果镜像是官方的去官方看是什么参数 如果是自定义的容器自己知道是什么参数 -v:数据卷
- 查看正在运行的容器
docker ps -a docker ps -aq docker ps -a -a查看所有容器包括没有运行的 -q只看容器的标识
- 停止启动容器
停止指定容器 :docker stop 容器ID 重启容器 :docker restart 容器ID 停止启动运行的容器 :docker start 容器ID 停止所有容器:docker stop $(docker ps -q)返回ID 开启所有容器:docker start $(docker ps -aq)返回ID
- 查看容器运行日志
docker logs -f 容器ID -f 可以滚动查看日志
- 进入容器的内部
docker exec -it 容器ID bash exit 退出容器
- 从宿主机把文件拷贝到容器
docker -cp 文件名 容器ID:容器内部名称
- 删除容器
docker rm -f 容器ID 强制删除(正在开启)
五、数据卷
数据卷:将容器的数据映射到宿主机上面
如果没有数据卷容器删除了数据就没有了,有了数据卷可以删除之后再次创建同数据卷还有原来的数据
- 创建数据卷
docker volume create 数据卷名字 默认目录是 /var/lib/docker/ 下的volumes文件 查看数据卷的详情(时间等):docker volume inspect 数据卷名字 查看全部数据卷:docker volume ls 删除数据卷:docker volumn rm 数据卷名字
- 容器映射数据卷
通过数据卷名称映射 docker run -v 数据卷名称:容器内部的路径 镜像ID 通过路径映射数据卷 docker run -v 路径:容器内部路径 容器ID
如果数据名称卷映射,如果不存在Docker会自动创建并将容器的内容存储在默认的路径
如果通过路径映射,直接指定一个路径,这个路径必须是空
例子:
第一中写法 先创建数据卷 docker volume create 数据卷名字 创建容器带数据卷 docker run --name 容器名字 -e 参数 -p 3306:3306 -v 数据卷名字:/var/lib/文件 -d mysql:5.7 第二种写法 $ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag /my/own/datadir宿主机路径 /var/lib/mysql容器路径
六、Dockerfile创建镜像
- 在于jar同一目录下创建Dockerfile
vi Dockerfile 必须是这个名字
Dockerfile内容
FROM openjdk:8-jre ENV HOME /home run mkdir HOM COPY ./movie.jar HOME/movie.jar WORKDIR HOME ENTRYPOINT java -jar movie.jar FROM openjdk:8-jre 继承openjdk:8-jre 镜像 ENV HOME /home 环境变量HOME 值为/home run mkdir HOME 在容器中创建HOME目录 COPY ./movie.jar HOME/movie.jar 把当前目录下的jar赋值到容器中去 WORKDIR HOME 定义容器的工作目录(以后一来打开就是HOME目录) ENTRYPOINT java -jar movie.jar 容器一来执行的命令
创建镜像
执行命令必须和Dockerfile在同一目录下 docker build -t movie(镜像名字):1.0(版本) .(不能少点)
查看镜像
docker images
创建容器
```text ```
docker run -d --name movie -p 8088:8088 movie:1.0/4f4d4f 镜像名或者ID
```
- 查看容器
docker ps
- 查看容器日志是否有
docker logs -f 容器ID
七、带参数的自定义镜像
- springboot打包
java -jar movie.jar --spring.profiles.active=test
上传最新代码并在部署机上拉取
打包成最新的jar
mvn clean package -Dmaven.test.skip=true
把新的jar包cope到和Dockerfile同级目录创建新的镜像
切换到Dockerfile目录下修改Dockerfile
FROM openjdk:8-jre ENV HOME /home ENV profile dev(默认值:重新定义一个环节变量) run mkdir HOM COPY ./movie.jar HOME/movie.jar(没改名字可不改) WORKDIR HOME ENTRYPOINT java -jar movie.jar --spring.profiles.active=$profile 就是上面的dev(不能写死)
- 创建新的镜像
docker build -t movie:2.0 . (记得最后一个点)
- 创建容器
开发环节创建 docker run -d -p 8087:8088 --name moviedev -e profile=dev movie:2.0 测试环境 docker run -d -p 8088:8088 --name movietest -e profile=test movie:2.0 端口不一样 里面的application的配置的数据库IP不一样 名字不一样 -e prfile=test/dev 激活的环境不一样 镜像一样
- 测试
192.168.25.134:8088/swagger-ui.html 192.168.25.134:8087/swagger-ui.html
八、docker-compos
可以通过docker-compose一键部署多个容器
- 下载docker-compose工具
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 用docker-compose编排一个容器
创建一个目录 mkdir -p /usr/docker/docker_compose/new_sql 进入new_sql目录并且创建docker-compose.yaml 编辑docker-compose.yaml vi docker-compose.yaml
docker-compose.yaml内容为
version: '3.1' services: new_mysql: # 服务的名称 restart: always # 代表只要docker启动,那么这个容器就跟着一起启动 image: mysql:5.7 # 指定镜像路径 container_name: new_mysql # 指定容器名称 ports: - 3308:3306 # 指定端口号的映射 environment: MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码 TZ: Asia/Shanghai # 指定时区 volumes: - ./data:/var/lib/mysql # 映射数据卷
- 编排容器
docker-compose up -d 即可开启里面编排的容器
- 编排多个容器
version: '3.1' services: fuwu1: # 服务的名称 restart: always # 代表只要docker启动,那么这个容器就跟着一起启动 image: movie:2.0 # 指定镜像路径 container_name: rongqi1 # 指定容器名称 ports: - 3308:3306 # 指定端口号的映射 environment: MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码 TZ: Asia/Shanghai # 指定时区 volumes: - ./data:/var/lib/mysql # 映射数据卷 fuwu2: # 服务的名称 restart: always # 代表只要docker启动,那么这个容器就跟着一起启动 image: movie:2.0 # 指定镜像路径 container_name: rongqi2 # 指定容器名称 ports: - 3309:3306 # 指定端口号的映射 environment: MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码 TZ: Asia/Shanghai # 指定时区 volumes: - ./data:/var/lib/mysql # 映射数据卷
- 编排容器
docker-compose up -d
- 卸载容器
docker-compose down
- docker-compose其他命令
启动管理的容器 docker-compose up -d 关闭并删除容器 docker-compose down 开启|关闭|重启已经存在的容器 docker-compose start|stop|restart 查看docker-compose管理的容器 docker-compose ps 查看日志 docker-compose logs -f
- docker-compose和Dockerdile连用
version: '3.1' services: new_mysql: # 服务的名称 restart: always # 代表只要docker启动,那么这个容器就跟着一起启动 build: context:../ #指定Dockerfile文件所在路径 dockerfile:Dockerfile #指定Dockerfile文件名称 image: mysql:5.7 # 打成镜像之后的名字 container_name: new_mysql # 指定容器名称 ports: - 3308:3306 # 指定端口号的映射 environment: MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码 TZ: Asia/Shanghai # 指定时区 volumes: - ./data:/var/lib/mysql # 映射数据卷
九、harbor
harbor是一个用于存储和分发Docker镜像的企业级Registry服务器
就像maven的私服 将镜像上传并可以自己下载还可以给其他人使用
- 下载
https://github.com/goharbor/harbor
- 克隆一个虚拟机
以有docker的虚拟机为父机来克隆 就不要重新装docker了
- 将压缩包解压
tar -zxvf habor.tgz.tar
进入harbor文件
修改harbor下的harbor.yml文件
修改 reg.mydomain.com 改为: 安装harbor的IP
- 关闭防火墙
systemctl stop firewalld
- 开启docker
start docker
- 执行当前目录下的install.sh
./install.sh
- 到浏览器输入安装harbor的IP地址检验
默认登录账户密码是 admin Harbor12345
新建项目
harbor命令
启动 docker-compose start 停止 docker-compose stop 重启 docker-compose restart 可以通过编排的方式启动harbor
- 连接harbor
在需要连接harbor的虚拟机上目录下的/etc/docker
编辑daemon.json加上镜像私服
{ "registry-mirrors": [ "https://registry.docker-cn.com" ], "insecure-registries": [ "192.168.0.136"(部署harbor的机器IP) ] }
- 重启或者启动docker
确保修改生效 重启docker systemctl restart docker 启动docekr systemctl start docker
确保要连接的机器开启了docker和关闭了防火墙
登录私服
docker login 192.168.0.136(部署私服的IP) -u admin -p Harbor
- 把镜像上传到私服
编辑想要传的镜像 docker tag 镜像id 192.168.0.136(部署及IP)/movie(harbor创建的项目名)/镜像名:2.0
推送镜像
docker push 标记的镜像名:版本 docker push (192.168.0.136/movie/movie)(名字):2.0
- 拉取镜像
复制harbor项目下的命令并执行即可拉取 docker pull 192.168.0.136/movie/movie:2.0
十、Jenkins