Linux和Docker系统学习

编程入门 行业动态 更新时间:2024-10-08 22:52:07

Linux和Docker<a href=https://www.elefans.com/category/jswz/34/1770742.html style=系统学习"/>

Linux和Docker系统学习

基础知识

常见linux系统有centos  Ubuntu等等

VMWare虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。

SSH连接工具-FinalShell

  • 企业中,Linux服务器通常位于远程机房中,用户不方便直接在机房操作;
  • 可以使用支持SSH协议的软件,通过远程登录操作访问服务器,并且SSH协议可以实现对传输内容的加密。

Docker是一个快速交付应用、运行应用的技术:
1.可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统;
2.运行时利用沙箱机制形成隔离容器,各个应用互不干扰;
3.启动、移除都可以通过一行命令完成,方便快捷。

Docker和虚拟机的差别

Docker和虚拟机的差异:
· docker是一个系统进程;虚拟机是在操作系统中的操作系统;
· docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。

Linux常见命令

1.如何查看端口占用情况?

一、查看已知端口占用情况 

 netstat -anp | grep 3306

 其中 25420/mysqld 分别代表的是进程号以及被哪个程序所占用

如果没有被占用,就什么都不显示。

二、查看全部端口占用情况

netstat -anp# 或者
netstat -tln

三、查看某关键字占用的进程

ps -ef | grep 关键字 ,可以查看启动信息中包含关键字的进程

 其中mysql代表UID:程序被该 UID 所拥有

25420代表PID:程序的 ID

四、kill被占用的进程

我们通过命令“netstat -anp | grep 3306”得到的“25420/mysqld”,这里的25420都是端口占用的对应进程的进程号,我们杀掉对应进程号即可。

kill -9 25420

但要注意mysql的进程关掉他的服务又会重新生成一个进程

可以使用 service mysql stop命令关掉数据库

五、关闭防火墙

systemctl stop firewalld

禁止开机启动防火墙 systemctl disable firewalld

六、linux关机命令

shutdown命令

docker常见命令

1.进入容器内部和退出容器内部

docker exec -it mysql bash //进入容器内部 
-it 后面可以跟容器名或者容器id
root@2e3a168e5396:/# mysql -uroot -p 
Enter password: 
//输入密码即可
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.25 MySQL Community Server (GPL)Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
//已经进入命令行模式

 可以查看容器中的数据库

退出的时候只需要Ctrl+d,使用两次后就可以回到原来的docker容器了

2.使用docker save导出镜像到磁盘

docker save -o [保存的目标文件名称] [镜像名称]


3.使用docker load加载镜像

docker load -i [镜像压缩文件名]
 

4.启动docker服务

systemctl start docker

 停止docker服务 systemctl stop docker

重启docker服务 systemctl restart docker

5.查看所有运行的容器及状态

docker ps 

docker ps -a 查看所有,包括未运行的容器

docker logs 查看容器运行日志

6.docker数据卷

docker volume create:创建数据卷
docker volume ls:查看所有数据卷
docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置
docker volume rm:删除指定数据卷
rocker volume prune:删除所有未使用的数据卷

创建nginx容器并挂载数据卷到容器内的HTML目录

nginx的html目录所在位置/usr/share/nginx/html

docker run --name myNginx -v html:/usr/share/nginx/html -p 80:80 -d nginx
 

Dockerfile自定义镜像

  • 常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须构建镜像了。还可以对官方镜像做扩展,以打包成我们生产应用的镜像。

镜像结构

  • 简单来说,镜像就是在系统函数库、运行环境的基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件

  • 我们要构建镜像,其实就是实现上述打包的过程

Dockerfile语法

构建自定义镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker我们的镜像组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像
而描述上述信息的就是Dockerfile文件。
Dockerfile就是一个文本文件,其中包含一个个指令(Instruction),用指令说明要执行什么操作来构建镜像,每一个指令都会形成一层Layer。


指令                          说明                                                                   示例

FROM                指定基础镜像                                                       FROM centos:6

ENV                  设置环境变量,可在后面指令使用                          ENV key value
COPY                拷贝本地文件到镜像的指定目录                          COPY ./mysql-5.7.rpm/tmp

ADD      与copy命令相似,但ADD额外也支持使用url指定的网络资源作为源文件,且tar类型文件会自动解压              ADD /

RUN                  执行Linux的shell命令,一般是安装过程的命令      RUN yum install gcc
EXPOSE         指定容器运行时监听的端口,是给镜像使用者看的     EXPOSE 8080

LABLE             为镜像指定标签                                                  LABEL version="1.0"

ENTRYPOINT    镜像中应用的启动命令,容器运行时调用               ENTRYPOINTjava -jar xxjar

CMD           构建镜像后调用,也就是在容器启动时才进行调用。 CMD ["/usr/bin/wc","--help"]

注:1.CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

2.ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
 而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD。
 Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,
 而只执行最后的ENTRYPOINT指令。
 通常情况下,    ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候 使用CMD传参


VOLUME  用于指定持久化目录(指定此目录可以被挂载出去)

VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"

注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它


 

WORKDIR  工作目录,类似于cd命令  WORKDIR /a (这时工作目录为/a)

 注:  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

 ARG  用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参

From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;"# 可以这如下这样灵活传参
docker build --build-arg=parameter=net-tools -t nginx:01 . 

制作镜像

  • 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
  • 如果有多个CMD,只有最后一个运行
  • 如果有多个Entrypoint,只有最后一个运行
  • 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数

镜像制作分为两个阶段

  1. docker build阶段 基于dockerfile制作镜像 (RUN,用于此阶段的运行命令)
  2. docker run阶段 基于镜像运行容器 (CMD,基于image run容器时候,需要运行的命令)
  3. docker build 基于第一阶段的镜像被别人from制作新镜像 (entrypoint 或onbuild 基于镜像重新构建新镜像时候在此阶段运行的命令)

构建Java项目

基于Ubuntu构建Java项目

需求:基于Ubuntu操作系统镜像构建一个新镜像,运行一个Java项目

1.创建一个空文件夹docker-demo

mkdir /tmp/docker-demo

2.将docker-demo.jar文件拷贝到docker-demo这个目录

3.拷贝jdk8.tar.gz文件到docker-demo这个目录

4.在docker-demo目录下新建Dockerfile,并写入以下内容

# 指定基础镜像
FROM ubuntu:16.04# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk的到JAVA_DIR目录下
COPY ./jdk8.tar.gz $JAVA_DIR/# 安装JDK
RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_44 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 拷贝java项目的包到指定目录下,我这里是/tmp/app.jar
COPY ./docker-demo.jar /tmp/app.jar# 暴露端口,注意这里是8090端口,如果你之前没有关闭防火墙,请关闭防火墙或打开对应端口,云服务器同理
EXPOSE 8090# 入口,java项目的启动命令
ENTERPOINT java -jar /tmp/app.jar

5.在docker-demo目录下使用docker build命令构建镜像

docker build -t docker_demo:1.0 .

6.使用docker images命令,查看镜像

[root@localhost docker-demo]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
docker_demo   1.0       c8acd2dd02cf   About a minute ago   722MB
redis         latest    29ab4501eac3   2 days ago           117MB
nginx         latest    3964ce7b8458   5 days ago           142MB
ubuntu        16.04     b6f507652425   15 months ago        135MB
mysql         5.7.25    98455b9624a9   3 years ago          372MB

7.创建并运行一个docker_demo容器

docker run --name testDemo -p 8090:8090 -d docker_demo:1.0

8.浏览器访问http://192.168.128.130:8090/hello/count,即可看到页面效果 

基于Java8构建Java项目

  • 虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包来构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。
  • 我们刚刚构建的Java项目有一个固定的死步骤,那就是安装JDK并配置环境变量,我们每次构建Java项目的镜像的时候,都需要完成这个步骤,所以我们可以找一个已经安装好了JDK的基础镜像,然后在其基础上来构建我们的Java项目的镜像
  • 需求:基于java:8-alpine镜像,将一个Java项目构建为镜像
  1. 新建一个空目录(或者继续使用/tmp/docker-demo目录)
  2. 将docker-demo.jar复制到该目录下(继续使用刚刚的目录就不用管)
  3. 在目录中新建一个文件,命名为Dockerfile,并编写该文件(修改为如下样子就好)
# 将openjdk:8作为基础镜像
FROM openjdk:8
# 拷贝java项目的包到指定目录下,我这里是/tmp/app.jar
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口
ENTRYPOINT java -jar /tmp/app.jar

4.构建镜像

docker build -t docker_demo:2.0 .

5.创建并运行一个docker_demo容器(在此之前停止之前的docker_demo容器)

docker run --name testDemo02 -p 8090:8090 -d docker_demo:2.0

小结

  1. Dockerfile本质就是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  3. 基础镜像可以使基本操作系统,如Ubunut,也可以是其他人制作好的镜像,例如openjdk:8

更多推荐

Linux和Docker系统学习

本文发布于:2024-03-15 08:50:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1738517.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:系统   Linux   Docker

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!