Docker笔记摘要
容器(docker)技术的价值
- 保证环境一致性,只要使用相同镜像部署就可以保证一致性
- 轻量级虚拟化访问,运行更快,资源更小.同时也可以荣期间的个开心
- 封装部署的负载类型,云原生与微服务的首选技术方案
- 未来测试人员必学的技术栈
Docker的学习路线
- 学习docker基本命令
- 学习使用Docker搭建常用软件
- 学习Docker网络模式
- 学习Docker的镜像制作(dockerfile)
- 容器集群-k8s的学习
Docker安装
- 切换管理权限
su root - 安装Docker依赖
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 - 安装docker
yum makecache fast && yum -y install docker-ce - 检查docker状态为loaded
systemctl status docker
Docker启动命令
启动: systemctl start docker
重启: systemctl restart docker
开机自启动: systemctl enable docker
运行状态: systemctl status docker
修改镜像仓库源
添加registry-mirrors
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}
重载docker的配置文件
systemctl daemon-reload
重启docker
systemctl restart docker
查看配置
docker info
Docker常用的容器管理命令
-
运行容器
docker run --name={your_name} --d {image_name}
-d 表示该容器启动起来之后不随着命令的停止而停止 -
查看docker容器
docker ps 仅查看正在运行的
docker ps -a 用于查看所有的容器,包括停止的 -
停止容器
docker stop {container_name} -
kill容器
docker kill {container_name} -
删除容器
docker rm -f {container_name} -
查看容器日志
docker logs -f {container_name}
-f 表示持续输出日志,否则输出最新的日志后马上停止 -
查看容器的元数据
docker inspect {container_name} -
bash进入容器
docker exec -it {container_name} -
按照名称去查询镜像
docker search {image_name} -
拉取镜像
docker pull {image_name} -
查看镜像仓库
docker images
Docker常用的镜像管理命令
- 拉取镜像
docker pull {image_name} - 推送镜像
docker push {image_name} - 查看当前机器所有的镜像
docker images {image_name} - 为镜像打一个tag
docker tag {source_image_name:tag your_image_name:tag} - 保存镜像为tar,用于以普通文件传输
docker save busybox > busybox.tar - 装载tar镜像到仓库中,用于以文件形式接收镜像
docker load < busybox.tar.gz
一行命令启动nignx
-
启动容器并映射端口
docker run -d -p 5003:80 --name mynginx nginx
-
启动容器并映射端口和映射文件
docker run -d -p 5003:80 -v “$PWD/html”:/usr/share/nginx/html --name mynginx nginx备注: 如果服务器在阿里云上,这需要通过"安全组" ==> “入方向” ==> "手动添加"来添加宿主机的端口
启动软件实例
一行命令启动Mysql
docker run --name fjc-mysql -v /home/test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1qaz9ol. -p 8888:3306 -d mysql:5.5
一行命令启动Jenkins
docker run --name myjenkins -itd -p 5004:8080 -p 50000:50000 --restart always --privileged=true --user root --env JAVA_OPTS=“-Xmx8192m” -v $(pwd)/jenkins_data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /bin/docker:/bin/docker jenkins/jenkins:lts
一行命令启动Jira
docker run -v “$PWD”/jira:/var/atlassian/application-data/jira --name=“jira” -d =p 5005:8080 atlassian/jira-software
一行命令启动testlink
docker run --name mariadb -e ALLOW_EMPTY_PASSWORD=yes -e MARIDB_USER=bn_testlink -e MARIADB_DATABASE=bitnami_testlink -v /home/mysql:/var/lib/mysql -p 8088:3306 bitnami/mariadb:latest
docker run -d --name testlink -p 5006:8080 -p 444:443 -e ALLOW_EMPTY_PASSWORD=yes -e TESTLINK_DATABASE_USER=bn_testlink -e TESTLINK_DATABASE_NAME=bitnami_testlink --link mariadb bitnami/testlink:latest
虚拟机和容器的区别
虚拟机:
server -> Host OS -> Hypervisor -> (Guest OS - > Bins/Libs -> App)
容器:
server -> Host OS -> Docker Engine -> (Bins/Libs -> App)
Docker的网络
网桥模式: 通过网口映射
host模式: 容器直接使用主机的网络
container模式: 使用–link,但是有缺陷,即只能在同一台虚拟机中, k8s中的容器都是用container模式启动的
Docker Compose
一个简单的容器编排工具,相关命令:
docker-compose up -d
docker-compose stop
docker-compose rm
docker-compose logs -f
docker-compose down
docker-compose ls
镜像介绍
一堆文件的集合
Docker容器镜像制作命令
相关命令
- docker commit
- docker file
使用docker commit命令制作
docker commit {容器名称} {新的镜像名称如myjenkins:V10}
使用docker file命令制作
相关命令
命令 | 说明 |
---|---|
FROM | 基于哪个镜像来实现,创建多个镜像时,可以使用多个FROM |
EXPOSE | 容器内应用可使用的端口 |
COPY | 用于从docker 主机复制新文件或者目录至创建的新镜像指定路径中 |
CMD | 容器启动后所执行的程序,如果使用docker run后面跟启动命令会被覆盖,格式:CMD [“可执行程序”,“参数1”,“参数2”] |
ENV | 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 |
RUN | 用于指定docker build过程中运行的程序,其可以是任何命令 |
ADD | 添加宿主机文件到容器里,有需要解压的文件会自动解压 |
MAINTAINER | 镜像的创建者 |
WORKDIR | 为后续的 RUN 、CMD 、ENTRYPOINT 指令配置工作目录。 |
VOLUME | 将宿主机的目录挂到容器里,-v |
ENTRYPOINT | 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。指定多个时,最后一个生效 |
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。 |
ONBUILD | 配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 |
LABEl | LABEL用于为镜像提供元数据信息,其数据格式为key=value。 |
参考博客: https://www.cnblogs.com/Insa/p/14660976.html
Docke私有镜像仓库操作
docker pull registry:2
docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry --restart=always --name registry registry:2
docker pull busybox
docker tag busybox localhost:5000/busybox:v1.0
docker push localhost:5000/busybox:v1.0
curl http://localhost:5000/v2/_catalog
Docker底层原理
Cgroups
cgroup是Linux用来限制进程使用资源的手段.容器也是利用这个技术进行资源的隔离
mount -t cgroups查看当前系统的cgroups
容器的故障注入
使用docker inspect 命令查询当前容器的PID
使用nsenter -t pid -n 切换到容器的网络名称空间
使用iptables/tc等命令进行故障注入
- docker ps查看容器名称
- docker inspect {容器名称},然后查看state下面的PID,并记录
- cd /proc/{PID}/ns 即可看到具体的信息
- 使用nsenter -t {PID} -n 即可切换到{PID}对应的命名空间
- 使用故障注入命令注入网络故障,比如ifdown, iptable等命令注入
镜像分层设计
- 每个镜像都是有多个层组成的.每一层都可以复用
- 编写docker时可以利用分层缓存的特点加速镜像开发过程
如果有Dockerfile中有多条命令,相对来说说,会影响容器性能