简单使用docker

Posted 冷血~多好

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单使用docker相关的知识,希望对你有一定的参考价值。

 

目录

使用官方安装脚本自动安装

启动 Docker

测试命令

查看docker中的镜像

如果是使用阿里云服务器,可以使用阿里云镜像加速

Docker常用命令

 启动容器

停止一个容器

查看容器

进入容器

 删除容器

从容器内拷贝文件到主机上

查看容器的cpu内存和网络状态 

镜像Commit(从容器创建一个新的镜像)

 容器数据卷

 使用数据卷

例子:把容器tomcat里的webapps目录挂载在docker外边实现数据持久化

 挂载数据库MySQL

匿名和具名挂载

 DockerFile

 DockerFile构建过程

DockerFile指令 

自定义镜像 tomcat

 发布镜像

IDEA整合Docker


docker run -itd --name tomcat03 -p 9091:8080 -v tomcat03:/usr/local/tomcat/webapps tomcat

使用官方安装脚本自动安装

curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun

启动 Docker

systemctl start docker

测试命令

查看版本

docker version

测试输出hello

docker run hello-world

查看docker中的镜像

docker images

 # 解释
REPOSITORY  镜像的仓库源
TAG     镜像的标签
IMAGE ID   镜像的ID
CREATED   镜像创建时间
SIZE     镜像大小

# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同
的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!

如果是使用阿里云服务器,可以使用阿里云镜像加速

 这里根据自身的阿里云来填写

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bwnhdsd6dsdo.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker常用命令

docker version  # 显示 Docker 版本信息。
docker info    # 显示 Docker 系统信息,包括镜像和容器数。。
docker --help   # 帮助
docker images   # 列出本地主机上的镜像
docker search mysql   # 搜索镜像  对应DockerHub仓库中的镜像

docker pull 镜像名称  # 下载镜像

# 删除镜像
docker rmi -f 镜像id             # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag      # 删除多个
docker rmi -f $(docker images -qa)      # 删除全部

查看容器/镜像的元数据

docker inspect 容器id

 启动容器

docker run -it --name 名字 容器id

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • hello-word: hello-world 镜像。
  • docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式
  • --name 给容器命名

停止一个容器

docker stop <容器 ID>

停止的容器可以通过 docker restart 重启:

docker restart <容器 ID>

查看容器

docker ps  #在运行的容器
docker ps -a #已创建的容器

进入容器

想要进入容器,可以通过以下指令进入:

  • docker attach

  • docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

attach 命令

docker attach [容器id]

 exec 命令

docker exec -it [容器id] /bin/bash

 删除容器

docker rm -f [容器id]

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

查看容器的cpu内存和网络状态 

docker stats 容器id   # 查看容器的cpu内存和网络状态

镜像Commit(从容器创建一个新的镜像)

docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]

例:

 容器数据卷

作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此
能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享

 使用数据卷

# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名

例子:把容器tomcat里的webapps目录挂载在docker外边实现数据持久化

docker run -itd --name tomcat01 -p 9090:8080 -v /usr/local/docker-tomcat01/webapps:/usr/local/tomcat/webapps tomcat:9.0

然后就可以把要发布的web应用放在外部目录进行发布,

 挂载数据库MySQL

docker pull mysql:5.7
docker run -d -p 3310:3306 -v /usr/local/docker-mysql01/conf:/etc/mysql/conf.d -v /usr/local/docker-mysql01/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7

匿名和具名挂载

# 匿名挂载
-v 容器内路径

docker run -itd --name tomcat02 -p 9090:8080 -v /usr/local/tomcat/webapps tomcat

# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls

# 具名挂载
-v 卷名:/容器内路径

docker run -itd --name tomcat03 -p 9091:8080 -v tomcat03:/usr/local/tomcat/webapps tomcat

# 查看挂载的路径

 docker volume inspect [卷名]

 # 改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限

docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

 DockerFile

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建步骤:
1、编写DockerFile文件
2、docker build 构建镜像
3、docker run

 DockerFile构建过程

基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
DockerFile 是软件的原材料 (代码)
Docker 镜像则是软件的交付品 (.apk)
Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可! 

DockerFile指令 

关键字:

FROM     # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER  # 镜像维护者的姓名混合邮箱地址
RUN      # 容器构建时需要运行的命令
EXPOSE    # 当前容器对外保留出的端口
WORKDIR    # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV      # 用来在构建镜像过程中设置环境变量
ADD      # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY     # 类似ADD,拷贝文件和目录到镜像中!
VOLUME    # 容器数据卷,用于数据保存和持久化工作
CMD      # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最
后一个生效!
ENTRYPOINT  # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD    # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的
ONBUILD被触发

例:

自定义一个 centos
1、编写DockerFile

mkdir dockerfile-test

vim mydockerfile-centos # 编辑文件

FROM centos
MAINTAINER xiaobai<123456789@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8090
CMD echo $MYPATH
CMD echo "----------end--------"
CMD /bin/bash

2、构建
docker build -f dockerfile地址 -t 新镜像名字:TAG .  (docker build 命令最后有一个 . . 表示当前目录****

docker build -f mydockerfile-centos -t mycentos:0.1 .

3、运行
docker run -it 新镜像名字:TAG

CMD 和 ENTRYPOINT 的区别

CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数
替换!
ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

自定义镜像 tomcat

创建tomcat文件夹

mkdir tomcat

 进入tomcat目录

cd tomcat

在上述目录下 touch read.txt
将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录 

 新建一个Dockerfile文件(然后填写一下内容)

FROM centos
MAINTAINER chenjinxian<1291759046@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下/usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.40.tar.gz /usr/local/
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.40/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.40/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out

然后在tomcat目录构建镜像

docker build -t mytomcat .

构建镜像成功

运行启动 run

docker run -itd --name webtomcat01 -p 9091:8080 -v /usr/local/docker-webtomcat01/webapps:/usr/local/apache-tomcat-9.0.40/webapps mytomcat

 发布镜像

注册dockerhub https://hub.docker.com,需要有一个账号

1、查看登录命令

docker login --help

2、登录

docker login -u 账号昵称

 3.将镜像发布出去 

docker push 镜像id

 注意镜像名称要带上dockerhub的账号昵称,否则会上传失败

例:xiaobai/id  

然后就可以从dockerhub拉取镜像了

docker pull 镜像id

比如通过以下命令拉取上边发布的镜像了

docker pull chenjinxian/webtomcat

IDEA整合Docker

创建项目
1、使用 IDEA 构建一个 SpringBoot 项目
2、编写一个helloController

@RestController
public class HelloController {
 @GetMapping("/hello")
 public String hello(){
   return "hello";
 }
}

3、启动测试

4、打jar包

 打包镜像

1、在项目下编写 Dockerfile 文件,将打包好的jar包拷贝到Dockerfile同级目录

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

2.将Dockerfile 和 项目的 jar 包上传到linux服务器上,构建运行

# 构建镜像

docker build -t springboot-test .

# 查看镜像
docker images

 # 运行

docker run -itd -p 9092:8080 --name springboot01 springboot-test

# 测试访问

以上是关于简单使用docker的主要内容,如果未能解决你的问题,请参考以下文章

创建自己的代码片段(CodeSnippet)

markdown docker-compose片段

sh Docker片段

为啥这段代码会泄露? (简单的代码片段)

如何使用Android片段管理器传递变量[重复]

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围