Dcoker简介
Docker历史
- Docker起源于2013年
- Docker是一个开源的应用容器引擎,基于Go语言开发,Dcoker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的系统。
Docker优点
- Docker可以用来快速交付应用。加快打包时间,加快测试,加快发布,缩短开发及运行代码之间的周期。
- 复杂环境管理,应用隔离:不同软件运行环境兼容依赖问题,开发环境/测试环境/线上环境保持一致。
- 轻量级:对于系统内核来说,一个docker只是一个进程,一个系统可以运行上千个容器。
Docker与虚拟机的区别
- 容器与容器之间只是进程得隔离,而虚拟机是完全的资源隔离。
- 虚拟机的启动可能需要分钟级别,Dcoker启动是秒级或者更短。
- 容易使用宿主操作系统的内核,而虚拟机使用完全独立的内核。
Docker架构
概念
- Docker镜像:Dcoker Images,每一个镜像都可能依赖一个或多个下层的镜像组成得另一个镜像,AUFS文件系统。
- Docker仓库:Docker Registry,集中存放镜像的地方。
- Docker容器:Dcoker Containers,镜像运行后的进程。
Window 10
- 下载地址:https://www.docker.com/products/docker-desktop
- 系统要求:不支持window 10家庭版操作系统
- 使用下载的exe文件一路安装即可
macOS
- 下载地址:https://www.docker.com/products/docker-desktop
Linux
Centos
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装
yum -y install docker-ce
Ubuntu
- 安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 安装证书:
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- 添加源:
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
- 安装Docker
apt -y install docker-ce
阿里云镜像加速器
先注册一个阿里云账号,登录阿里云的镜像仓库:https://cr.console.aliyun.com/cn-hangzhou/instances
- 获取阿里云的加速器地址
配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
基本命令
# docker版本信息
docker version
# docker系统信息
docker info
问题: 如果使用命令docker info
遇到如下错误:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
解决方法:
- 首先确定docker是否正确安装
- 如果已经正确安装,则是docker没有正常启动,所以在相应的/var/run/ 路径下找不到docker的进程。
- 执行如下命令:
service docker start
,启动docker服务即可。
镜像管理
# 查看所有镜像
docker images
# 搜索镜像
docker search [镜像名称]
# 拉取下载
docker pull [镜像名称]:latest
docker pull [镜像名称]:[指定版本号]
# 导出
docker save [镜像名称:版本号]>[镜像名称:版本号].tar
# 导入
docker load<镜像名称].tar
# 删除
docker rmi [镜像名称]:latest
docker rmi [镜像名称]:[指定版本号]
docker rmi [镜像ID]
# 更改镜像名
docker tag [镜像名称]:[版本名称] [新镜像名称]:[版本名称]
# 查看镜像创建历史
docker history [镜像名称]
容器管理
# 运行容器
docker run [镜像名称]
# -d表示后台运行
docker run -d --name=[指定名称] [镜像名称]:[版本名称] ping [IP]
# 查看运行的容器
docker ps
docker ps -a
# 查看容器中运行的进程
docker top [容器名称]
docker top [容器ID]
# 查看资源占用
docker stats [容器名称]
# 启动容器
docker start [容器名称]
# 重启容器
docker restart [容器名称]
# 停止容器
docker stop [容器名称]
# 杀掉容器进程
docker kill [容器名称]
# 暂停容器
docker pause [容器名称]
# 取消暂停容器
docker unpause[容器名称]
# 强制删除容器
docker rm -f [容器名称]
# 执行命令
# -i 交互式
# -t 终端
docker exec -it [容器名称] ls
# 复制文件
docker cp [容器名称]:/etc/hosts [复制的目的路径]
# 查看容器日志
docker logs -f [容器名称]
# 查看容器/镜像的元信息
docker inspect [容器名称]
# 格式化输出
docker inspect -f '{{.id}}' [容器名称]
docker inspect -f '{{.Created}}' [容器名称]
# 更多inspect语法参考:https://www.runoob.com/docker/docker-inspect-command.html
# 查看容器内文件结构
docker diff [容器名称]
Nginx 简介
Nginx(发音同 engine x)是一个异步的Web服务器,主要提供Web服务、反向代理,负载均衡和HTTP缓存功能。由Igor Sysoev创建于2004年,使用C语言开发。
运行Nginx容器
- 拉取容器
# 拉取
docker pull nginx:1.17.9
- 运行容器
# 运行
docker -p [启动端口]:[nginx映射端口,默认是80] [容器名称]:[版本名称]
docker -p 88:80 nginx:1.17.9
# 运行
docker run -d --name [容器名称] -p [启动端口]:[nginx映射端口,默认是80] [容器名称]:[版本名称]
docker run -d --name test -p 88:80 nginx:1.17.9
- 挂载目录运行
# 挂载目录
docker run -d --name [容器名称]-p [启动端口]:[nginx映射端口,默认是80] -v [指定目录]:[指定目录] [容器名称]:[版本名称]
docker run -d --name nginx -p 88:80 -v ${PWD}/html:/usr/share/nginx/html nginx:1.17.9
TestLink简介
TestLink是基于WEB的测试用例管理系统,主要功能是:测试项目管理、产品需求管理、测试用例管理、测试计划管理、测试用例的创建、管理和执行,并且还提供了统计功能。
部署数据库
安装容器网络
# 容器网络
docker network create testlink
# 查看所有的容器网络
docker network ls
运行数据库
# 运行数据库
docker run -d --name mariadb -e MARIADB_ROOT_PASSWORD=mariadb -e MARIADB_USER=bn_testlink -e MARIADB_PASSWORD=bn_testlink -e MARIADB_DATABASE=bitnami_testlink --net testlink -v ${PWD}/mariadb:/bitnami bitnami/mariadb:10.3.22
参数说明:
-d:后台运行
–name:设置别名
-e:设置参数
-e MARIADB_ROOT_PASSWORD=mariadb:设置管理员密码
-e MARIADB_USER=bn_testlink:创建一个用户
-e MARIADB_PASSWORD=bn_testlink:用户密码
-e MARIADB_DATABASE=bitnami_testlink:新建数据库
–net testlink:指定网络
-v ${PWD}/mariadb:/bitnami bitnami/mariadb:10.3.22:挂载当前目录
bitnami/mariadb:10.3.22:镜像名字
问题这里遇到了一个运行,使用命令docker ps -a
查看容器mariadb是否正常运行时,容器不是运行状态。
解决办法:
- 通过日志查找原因。
原因在于:mkdir: cannot create directory '/bitnami/mariadb': Permission denied
# 查看mariabd日志查找原因
docker logs -f mariadb
- 在当前目录下给/bitnami/mariadb添加权限
# 给目录赋予权限
chmod 777 mariadb/
- 重新启动mariadb
docker start mariadb
部署TestLink
docker run -d -p 8089:8080 -p 443:443 --name testlink -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_PASSWORD=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --net testlink -v ${PWD}/testlink:/bitnami bitnami/testlink:1.9.20
参数说明
-p 8089:8080:http协议端口
-p 443:443:https协议端口
–name testlink :设置别名
-e:设置参数
-e TESTLINK_DATABASE_USER=bn_testlink:传入数据库用户
-e TESTLINK_DATABASE_PASSWORD=bn_testlink:传入数据库密码
-e TESTLINK_DATABASE_NAME=bitnami_testlink:传入数据库名
–net testlink:指定testlink网络和数据库在一个网络下
-v ${PWD}/testlink:/bitnami :挂载当前目录
bitnami/testlink:1.9.20:镜像的版本信息和名字
![在这里插入图片描述](
问题
这里遇到了一个运行,使用命令docker ps -a
查看容器testlink是否正常运行时,容器不是运行状态。
解决办法:
- 通过日志查找原因。
原因在于:mkdir: cannot create directory '/bitnami/testlink': Permission denied
# 查看mariabd日志查找原因
docker logs -f testlink
- 在当前目录下给/bitnami/mariadb添加权限
# 给目录赋予权限
chmod 777 testlink/
- 重新启动testlink
docker start testlink
使用testlink
- 打开浏览器,输入本机IP地址(如:http://127.0.0.1:8089),进入testlink登录页面。
- 输入用户名和密码,testlink默认用户名是:user 默认密码是:bitnami,点击登录按钮。登录后即可进行操作。
Jenkins简介
Jenkins是开源CI&CD软件领导者,提供持续集成和持续交付服务,有超过1000个插件来支持构建、部署、自动化,满足任何项目的需要。
部署Jenkins
Docker hub: https://hub.docker.com/r/jenkins/jenkins/
运行Jenkins (方式一)
# 运行(方式一)
docker run -d --name=jenkins -p 8087:8080 jenkins/jenkins
参数说明:
-d //启动在后台
–name //容器名字
-p //端口映射(8081:宿主主机端口,8080:容器内部端口)
问题
这里运行遇到了一个错误“docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: dial tcp: lookup registry-1.docker.io on 172.16.2.53: server misbehaving.”
解决办法:
出现这个问题是dns服务器的错误,把服务器改成8.8.8.8或者114.114.114.114即可。
# 在文件中加上DNS
vim /etc/sysconfig/network-scripts/ifcfg-lo
# 注意:如果没有找到ifcfg-lo这个文件,可以看下当前目录下其他ifcfg-开头的文件,查看一下内容,分辨一下是加在哪个文件里面。
# 重启网络
systemctl restart network
大功告成了!
Jenkins已经成功启动。
运行Jenkins(方式二)
# 挂载目录
# 运行 (方式二)
docker run --name jenkins -d -p 8087:8080 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
chmod 777 /data/jenkins_home
参数说明:
-d //启动在后台
–name //容器名字
-p //端口映射(8081:宿主主机端口-可自定义,8080:容器内部端口-不可自定义)
-v //数据卷挂载映射(/data/jenkins_home:宿主主机目录,另外一个即是容器目录)
Jenkins/jenkins:lts //Jenkins镜像(最新版)
查看Jenkins是否访问成功,发现并没有。
通过查看Jenkins日志定位一下问题,发现是权限问题。
给/data/jenkins_home赋予权限。
Jenkins启动成功。
访问Jenkins
问题
这里遇到了一个问题。由于上面我重启了网络。systemctl restart network
,导致Docker daemon服务自动设置的临时启用IP_FORWARD配置失效,因此我运行了Jenkins,但是无法访问成功。
解决办法
解决方法思路来源于:。
# 查看当前系统的IP_FORWARD是否启用
sysctl net.ipv4.ip_forward
# 启用当前系统的IP_FORWARD
echo 'net.ipv4.ip_forward=1' >>/usr/lib/sysctl.d/50-default.conf
# 重启服务器或使用下面的命令从文件中加载配置
sysctl -p /usr/lib/sysctl.d/50-default.conf
Jenkins启动成功。打开浏览器,输入本机IP地址(如:http://127.0.0.1:8086),进入Jenkins登录页面。
查看默认密码
# 查看默认密码
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
进入jenkins_home安装目录
格式:docker exec -it {容器名称} bash
Docker-compose简介
Docker-compose是用于定义和运行多容器的Dcoker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序的服务。
Compose的使用一般分为三步:
- 使用Dockerfile定义应用程序的环境,以便可以在任何地方复制它。
- 在docker-compose.yml中定义组成应用程序的服务,以便它们可以在隔离环境中一起运行。
- 运行docker-compose up,然后Compose启动并运行您的整个应用程序。
官方文档:https://docs.docker.com/compose/
Docker-compose安装
macOS,windows系统使用Dcoker Desktop默认已经安装。
Linux系统:
- https://github.com/docker/compose/releases/
# 下载服务文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 下载的文件会输出到 /usr/local/bin/docker-compose
# 授予权限
sudo chmod +x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose version
Dcoker-compose常用命令
查看配置:docker-compose config
后台启动:docker-compose up -d
构建镜像:docker-compose build
下载镜像:docker-compose pull
运行的:docker-compose ps
进程:docker-compose top
启动:docker-compose start
停止:docker-compose stop
Docker-compose演示
通过一个Python web小实例来演示Docker-compose的功能。
暂略,待补充。
简介
地址:https://hub.docker.com/_/registry
Dcoker registry是存储Dcoker image的仓库,运行push,pull,search时,是通过Dcoker daemon与docker registry通信。有时候会用Dcoker Hub这样的公共仓库可能不方便,我们可以通过registry创建一个本地仓库。
运行
docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.1
运行成功后,访问:http://服务器ip:5000/v2/_catalog,如:http://182.61.19.183:5000/v2/_catalog,可以查看到我们有一个空的仓库。
使用
# 检查服务器版本
cat /etc/redhat-release # CentOS Linux release 7.9.2009 (Core)
# 进入docker安装目录
cd /etc/docker
# 编辑daemon.json(不存在则新建)
vim daemon.json
"""
内容如下
{
"insecure-registries":["182.61.19.183:5000"]
}
"""
# 重启docker使得配置生效
systemctl restart docker
# 将镜像推送到本地仓库
docker push nginx:1.17.9
# 从本地仓库下载镜像
docker pull nginx:1.17.9
简介
Dockerfile是由一系列指令和参数构成的脚本,一个Dockerfile里面包含了构建整个镜像的完整命令。通过docker build执行Dockerfile中一系列指令自动构建镜像。
常用指令
- FROM:基础镜像,FROM领了必须是Dockerfile的首个命令。
- LABEL:为镜像生成元数据标签信息。
- USER:指定运行容器的用户名或UID,后续RUN也会使用指定用户。
- RUN:RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用户创建镜像。每条RUN命令在当前基础镜像上执行,并且会提交一个新镜像层。
- WORKDIR:设置CMD指明的命令的运行目录。为后续RUN,CMD,ENTRYPOINT,ADD指令配置工作目录。
- ENV:容器启动的环境变量。
- ARG:构建环境的环境变量。
- COPY:复制文件。
- CMD:容器运行时执行的默认命令。
- ENTRYPOINT:指定容器的“入口”。
- HEALTHCHECK:容器健康状态检查。
演示
使用Dockerfile构建一个Nginx容器,添加容器健康检查。
暂略,待补充。
docker镜像构成简介
在日常的工作中,尝尝需要制作自己项目的镜像,一般通过以下两种方式制作镜像:Docker commit、Dockerfile。
Docker commit命令
Dcoker commit一般用作从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dcokerfile来完成。默认commit镜像,对外不可解释,不方便排查问题,可维护性差。
docker commit 容器名 新镜像名:tag
Docker build命令
使用Dcokerfile的方式。
# 忽略文件
dockerignore
# 指定文件
docker build -f
# 添加标签
docker build -t
# 不使用缓存
docker build -no-cache
# 构建时变量
docker build --build-arg
# ARG指定变量
演示
暂略,待补充。