侧边栏壁纸
博主头像
千异博主等级

学无止境,学以致用,志存高远!

  • 累计撰写 28 篇文章
  • 累计创建 26 个标签
  • 累计收到 0 条评论

docker基础知识——一篇文章就够了

千异
2022-04-29 / 0 评论 / 2 点赞 / 1,427 阅读 / 4,214 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

安装步骤

安装完后更换阿里云镜像:

vim /etc/docker/daemon.json

输入下面内容

{
  "registry-mirrors": ["https://r1xt5cgh.mirror.aliyuncs.com"]
}

重新导入配置

systemctl daemon-reload
systemctl restart docker

常用命令

docker images	#列出已经下载的镜像
docker images -q	#列出镜像id
docker info	#查看docker安装信息
docker search 镜像名	#搜索镜像
docker search --no-trunc 镜像名	#搜索镜像时显示所有描述信息
docker pull 镜像名:标签	#拉取镜像,如果不跟上标签名,默认下载最新版
docker rmi 镜像名	#删除镜像
docker ps	#查看正在运行的容器
docker ps -a	#查看所有的容器
docker ps -l	#查看最后一次运行的容器
docker ps -f status=exited	#查看已经停止的容器
docker run [option] 镜像名[:标签名]	#创建和运行容器
	-i 表时交互式运行容器,容器创建后,会启动并进入容器内部,通常与-t同时使用。
	-t 启动后进入容器命令行,通常与-i同时使用,加入-it两格参数后,容器创建就能登录进去,即分配一个伪终端。
	-name 为创建的容器指定一个名称。
	-d 创建一个守护式容器,并返回容器id。容器并不会立即运行,如果加上-i参数,就会立即运行。
	-v 表时目录影射,格式为-v 宿主机目录:容器目录。
	-p 表示端口映射,格式为-p 宿主机端口:容器端口。

docker run -it --name=centos centos:7 [/bin/bash]	#启动一个Centos容器,中括号内可以省略

exit		#在容器中执行,退出当前容器,容器会停止运行
ctrl+p+q	#退出容器,但是容器不会停止运行
docker stop 容器名	#停止容器
docker start 容器名	#启动容器
docker restart 容器名	#重启容器
docker rm [-f] 容器名	#删除容器
docker ps -a -q或docker ps -aq	#查看所有容器的id,-a表示所有,-q表示查id
docker rm -f `docker ps -aq`	#删除所有容器,反引号内传入查询id的命令即可
docker stop `docker ps -aq`	#停止所有容器
docker start `docker ps -aq`	#删除所有容器
docker kill 容器名|容器id	#强制停止,一般不使用
docker run -id --name=centos centos	#创建并后台运行一个Centos容器
docker exec -it 容器名 /bin/bash		#登录并进入一个正在运行的容器,通过此方式进入后,exit退出也不会停止容器。
docker cp 宿主机文件或目录 容器名称:容器内目录	#复制宿主机文件到容器内部
docker cp 容器名称:容器内目录 宿主机文件或目录	#复制容器内文件到宿主机
docker run -id -v 宿主机绝对路径目录:容器内目录[:ro] --name=容器名 镜像名	#创建并后台运行一个容器,将容器内部目录映射到宿主机,如果加上中括号内的内容,则目录为只读,ro=read only
docker run -id -v /opt:/opt:ro --name=centos centos	#启动并后台运行一个centos容器,挂载opt目录到宿主机,并且设置为只读。
docker inspect 容器名	#查看容器内部细节

docker部署实战

docker run -id --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql	#启动并运行一个MySQL容器,-e设置容器内参数,此处设置密码为123456
docker exec -it mysql mysql -uroot -p123456	#连接到mysql容器内的mysql数据库
docker run -id --name=redis -p 6379:6379 redis	#启动并运行一个redis容器
docker run -id --name=tomcat -p 8888:8080 -v /usr/local/project:/usr/local/tomcat/webapps --privileged true tomcat	#启动一个tomcat容器,多级映射可能会有权限问题,所以使用--privileged true
docker run -id --name=rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management	#启动一个rabbitmq容器,默认用户名guest,密码guest
docker run -id --name=rabbitmq -e RABBITMQ_DEFAULT_USER username -e RABBITMQ_DEFAULT_PASS password -p 5672:5672 -p 15672:15672 rabbitmq:management #指定默认的用户名和密码

容器备份

docker commit [-m "提交的描述信息"] [-a "创建者"] 容器名称或容器id 生成的镜像名[:标签名]	#将容器打包成镜像

docker commit -m "mysql镜像" -a "jiangqiang" mysql mymysql:latest	#将名为mysql的容器打包为名为mymysql:latest的镜像
docker inspect --format='{{.Mounts}}' 容器名	#查看是否有挂载目录

只有当没有挂载目录时,才可以使用上面的命令直接打包成镜像。因为如果Docker对容器挂载了数据目录, 在将容器保存为镜像时,数据不会被保存到镜像中。

解决:

  • 目录挂载方法。先把在宿主机的数据备份在某个目录下,在 docker run 的时候使用-v参数将宿主机上的目录映射到容器里的目标路径中(tomcat是 /usr/local/tomcat/webapps ,mysql是var/lib/mysql )
  • 拷贝方法。先把在宿主机的数据备份在某个目录下,通过拷贝的方法 docker cp 将备份的数据复制进容器里的目标路径中(tomcat是 /usr/local/tomcat/webapps ,mysql是 var/lib/mysql )。

Dockerfile

  1. 语法规则

    1. 每条指令的保留字都必须为大写字母且后面至少要有一个参数
    2. 执行顺序按从上往下执行。
    3. #用于注释
    4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  2. 执行流程

    1. Docker 从基础镜像运行一个容器
    2. 执行每一条指定并对容器作出修改
    3. 执行类似 docker commit 的操作提交一个新的镜像层
    4. docker 再基于刚提交的镜像运行一个新容器
    5. 执行 Dockerfile 中的下一条指令直到所有指令都执行完成3
  3. 常用指令

指令(大写的是保留字)作用
FROM image_name:tag基础镜像,基于哪个基础镜像启动构建流程
MAINTAINER user_name镜像的创建者的姓名和邮箱地址等
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件, 将会在复制后自动解压
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条),运行到当前行要执行的其他命令(可想象成sout("aaa") )
WORKDIR path_dir设置工作目录,当创建容器后,命令终端默认登录进来后所在的目录。未指定则为根目录 /
EXPOSE port当前对外暴露的端口号,使容器内的应用可以通过端口和外界交互
CMD argumentDockerfile中可以有多个CMD,但是只有最后一个会生效。在构建容器时,会被 docker run 后面指定的参数覆盖。
ENTRYPOINT argument和CMD相似,但是并不会被docker run指定的参数覆盖,而是追加参数
VOLUME将宿主机文件夹挂载到容器中

构建一个jdk镜像

  1. 在宿主机上创建目录,并切换到新建的目录中
mkdir -p /usr/local/mydocker 
cd /usr/local/mydocker
  1. 下载 jdk-8u111-linux-x64.tar.gz 并上传到服务器(虚拟机)中的/usr/local/mydocker 目录
  2. 创建Dockerfile文件vim Dockerfile
#来自基础镜像 
FROM centos:7 
#指定镜像创建者信息 
MAINTAINER suixin
#切换工作目录/usr/local
WORKDIR /usr/local
#创建一个存放jdk的路径
RUN mkdir /usr/local/java
#将jdk压缩包复制并解压到容器中/usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java

#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

CMD ["/bin/bash"]
  1. 构建镜像语法
docker build [-f 指定Dockerfile所在路径与文件名] -t 生成的镜像名:标签名 .

注意后边的空格和点.不要省略, . 表示当前目录
-f 指定Dockerfile文件所在路径与文件名。如果未指定-f值,则找当前目录下名为Dockerfile的构建文件

示例:生成镜像名为jdk,标签为1.8

docker build -t jdk:1.8 . 1
  1. 查看镜像是否构建完成
docker images
  1. 创建并运行容器
docker run -it --name=myjdk8 jdk:1.8 /bin/bash
2
博主关闭了所有页面的评论