docker小知识
docker 共享内核,即容器是共享主机操作系统内核但提供用户空间隔离的虚拟环境;Docker容器本质上是宿主机上的进程,Docker通过namespace实现了资源隔离
Docker 四种网络模式
-
none模式,使用–net=none指定,该模式关闭了容器的网络功能。
-
host模式,使用–net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
-
bridge模式,使用–net=bridge指定,默认设置 ,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。
-
container模式,使用–net=container:NAME_or_ID指定,创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
设置docker镜像加速
vi /etc/docker/daemon.json ## 文件路径
{
"registry-mirrors": [
"https://4j0no3kc.mirror.aliyuncs.com"
]
}
docker基本命令
docker pull {image_name} (拉取镜像)
docker push {image_name} (推送镜像)
docker images (查看当前机器的所有镜像)
docker rmi {image_name} (删除当前机器的一个镜像)
docker tag {source_images_name:tag your_image_name:tag} 为一个镜像打tag
docker save busybox > busybox.tar
docker load < busybox.tar.gz
docker ps (显示正在运行的容器)
docker search xxx (搜索镜像)
docker run --name={your_name} --d {image_name} (运行容器:第一次)
docker start {容器名字} (启动已存在的容器)
docker ps -s -a (查看当前所有容器)
docker stop {container_name} (停止容器)
docker kill {container_name} (杀死容器)
docker rm -f {container_name} (删除容器)
docmer rmi {container_name} (删除镜像)
docker rm 'docker ps -a -q' (删除所有的容器)
docker logs -f {容器名称} (查看容器日志)
docker info (查看docker服务信息)
docker inspect {容器名称} (查看docker容器的信息)
docker exec -it {容器名称} /bin/bash 进入容器,exec的意思是在容器中运行一个命令。 如果是bash 并且指定了-it 就会打开容器的shell 交互
docker cp {container:name}:{container_path} {host_path} 把宿主机上的一个文件copy到容器中
--name # 为容器指定一个名称
-d 后台运行
-port (指定端口映射规则 -p 8086:8086,前面是宿主机端口,后面的容器端口)
--network 指定容器运行的网路模式
—link 可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据
-v 指定需要挂载的数据卷,把宿主机文件挂载在容器内,挂载目录的目的是数据持久化,写到宿主机硬盘里,这样容器被你删掉的话,数据才不会丢失
-env 指定需要传递给容器的环境变量
--restart 让docker自动重启容器。--restart会检查容器的退出代码,并根据此来决定是否重启容器,非0时,自动重启
--restart=on-failure:5 当容器退出代码为非0时,docker会尝试自动重启该容器,最多重启5次
在-d 后添加--restart=unless-stopped下次docker启动后,容器就会自动启动
demo
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
docker run:用镜像启动容器
--name=hub:指定容器的名称
-p 5001:4444:端口映射,5001宿主机端口,4444容器端口
-e:env的缩写,也就是环境变量,传递一些环境变量,让容器启动的时候初始化一些参数
-d:后台运行
-v:挂载,把容器内目录映射到宿主机内,前面为宿主机目录,后面为容器目录
dockerfile基本命令
FROM:基础镜像,FROM 命令必须是 Dockerfile 的首个命令。
LABEL:为镜像生成元数据标签信息。
USER:指定运行容器时的用户名或 UID,后续 RUN 也会使用指定用户。
RUN:RUN 命令是 Dockerfile 执行命令的核心部分。它接受命令作为参数并用于创建镜像。每条 RUN 命令在当前基础镜像上执行,并且会提交一个新镜像层。
WORKDIR:设置 CMD 指明的命令的运行目录。为后续的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目录。
ENV:容器启动的环境变量。
ARG:构建环境的环境变量。
COPY:复制文件
CMD:容器运行时执行的默认命令。
ENTRYPOINT:指定容器的“入口”。
HEALTHCHECK:容器健康状态检查。
docker的安装
- mac
brew cask install docker - CentOS
yum install docker
ps:不推荐在win上安装docker,所以没写
docker的启动与停止
systemctl start docker #启动docker
systemctl status docker #查看docker状态
systemctl stop docker #停止docker
systemctl restart docker #重启docker
systemctl enable docker #开机启动docker
制作镜像的方式
第一种方法
启动已有镜像,进入容器,修改至预期配置后,通过docker commit 容器的名称 镜像的名称:tag,进行提交创建(不会影响原有镜像);不推荐此种方式,如果在大规模的使用镜像,这种镜像制作过程是黑盒的,用户使用镜像时无法得知镜像内有哪些内容,如果想进行改造时,是做不到的;
- 进入docker 容器,新增文件test.log
- 提交更新,制作新的镜像
- 启动容器,进入容器内部,可以发现制作镜像时添加的test.log文件已存在于容器内
第二种方法
通过dockerfile进行制作,dockerfile是把制作镜像的过程当做可编程的方式,像写代码一样把制作镜像的过程编程为名叫dockerfile的文件,文件内有不同的指令,每个指令执行不同的任务,通过这种方式可以把制作镜像的过程记录下来,方便用户去了解镜像内有那些内容,方便维护以及进行二次改造。
- dockerfile基本命令
FROM 指定基础镜像(也叫做继承镜像),指明构建的新镜像是继承于哪个基础镜像
RUN 构建镜像时运行的shell镜像
EXPOSE 声明容器运行的服务端口
ADD 拷贝宿主机的文件或者目录添加至镜像内部(如果是url,会自动下载解压)
COPY 拷贝宿主机的文件或者目录添加至镜像内部(不会自动下载解压)
CMD 启动容器时执行的shell命令
ENV 设置镜像内的环境变量
ENTRYPOINT 启动容器时的shell命令(启动容器时执行的shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序;如果存在多个ENTRYPOINT指令,只有最后一个生效)
USER 为RUN、CMD和ENTRYPOINT执行shell命令时指定运行用户
WORKDIR 为后续的RUN、CMD、ENTRYPOINT指令配置工作目录(可以使用多个WORKDIR指令,后续命令如果参数时相对路径,则会基于之前命令指定的路径)
- dockerfile demo:
FROM selenium/node-chrome-debug:3.7.1-beryllium
USER root
ADD run.sh /root/
RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean \
&& mkdir -p mkdir -p ~/.vnc \
&& x11vnc -storepasswd work123 ~/.vnc/passwd
ENTRYPOINT ["/root/entrypoint.sh"]
构建镜像
docker build -t testimage:1.0 .
命令解析:-t 设置镜像的名字或标签;testimage 镜像的名字;1.0 镜像的tag;. 代表设置当前目录为工作目录
dockerfile执行过程
ps:dockerfile本质上只是docker commit自动化的过程,dockerfile优势在于可以让使用者很直观的了解到当前镜像有那些功能,做了什么。
常用容器搭建
- mysql
docker run --name mysql -v $PWD/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -d mysql
$PWD:为变量,取的是当前路径
- testlink
运行mariadb
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
运行testlink
docker run -d -p 8080:8080 -p 8443:8443 --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
默认用户名:user,默认密码:bitnami。