持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
1 容器的创建和启动
1.1 虚拟机的生命周期
编辑
1.2 容器的生命周期
编辑
2、容器操作
2.1 查看容器
- 查看正在运行容器:
docker ps
- 查看所有的容器(启动过的历史容器)
docker ps –a
编辑
- 查看最后一次运行的容器:
docker ps -l
- 查看停止的容器
docker ps -f status=exited
2.2 创建与启动容器
# 作用:
利用镜像创建出一个Created 状态的待启动容器
# 命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
创建容器常用的参数说明:
创建容器命令:docker run
-i --interactive:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 创建容器命令演示:
docker create --name test-container centos:centos7 ps -A
# 我们创建了一个容器,并指定在启动容器的时候执行:docker ps -a
docker create -ti --name test-container2 centos /bin/bash
2.2.1 创建交互式容器
创建一个交互式容器并取名为mycentos
docker run -it --name=mycentos centos:7 /bin/bash
编辑
开启另外一个终端来查看状态:
docker ps
# 1.如果是一个夯在哪里得命令,则使用exit退出容器
# 2.如果不是则会自动退出容器
编辑
退出当前容器:
exit
编辑
然后用ps -a 命令查看发现该容器也随之停止:
2.2.2 守护式容器
创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器
命令如下(容器名称不能重复):
docker run -di --name=mycentos2 centos:7
# 当我们在后台启动的时候
1.比如:docker run -di --name=mycentos2 centos:7
2.这时他会自动启动一个 /bin/bash窗口
3.因为我们并没有关闭这个/bin/bash窗口,所以他会一直在后台运行
4.我们在使用start或者直接run进入这个镜像的时候,就相当于运行的这个命令:/bin/bash,就进入了这个bash窗口,相当于进入了容器(其实不是进入了容器,可以把他看作是xshell一个远程连接,连接到这个容器。)这里我们看作是进入到了这个容器,当我们使用exit退出的时候,就相当于关闭了/bin/bash这个窗口。所以容器一直会在后台运行的原因就是这个/bin/bash窗口一直在启动这,没有关闭它
编辑
登录守护式容器:
docker exec -it container_name (或者container_id)/bin/bash(exit退出时,容器不会停止)
命令如下:
docker exec -it mycentos2 /bin/bash
编辑
编辑
2.2.4 容器创建并启动 – docker run
# 创建并启动(run)
# 参数:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
--name :为创建的容器命名。如果不写,会自动分配一个名字(英文人名)
-v:表示目录映射关系(前者是宿主机目录,后者是容器目录,映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。(下述单独演示)
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 (下述单独演示)
# 例子:run
docker run -it --name=myredis redis # 这时就会启动redis容器并进去redis容器
docker run -id --name=oursql mysql # 这时就不会进入mysql容器,再后台运行
# 注意,docker run 镜像
使用该命令:如果本地没有,会先pull,再run
3 进入容器内部和退出容器
3.1 进入容器
# 方式1:
1.查询机器上运行的容器
docker ps
2.进入容器
docker exec -it 容器id/bin/bash
docker exec -it 427 /bin/bash
# 第二种:ssh连接(容器内部装ssh服务端)(不常用)
编辑
# exec真正的作用是在容器内执行命令,而不是真正的进入到容器内部
1.因为 /bin/bash这个命令,就相当于与这个容器建立了连接,所以我们可以和容器做交互,当我们关闭这个连接的时候,就会自动结束掉这个容器。
2.执行exec命令:
docker exec -it 容器id ls # 查询根路径所有文件
编辑
# top 命令(容器内部执行查询进程)
编辑
# 容器内部是纯净的空间,安装:vim
编辑
3.2 (-it 进入容器退出) 与 (-id 进入容器退出)区别
# -it 进入容器退出(前台容器自动结束【后台停止运行】)
1.在我们使用 -it 参数直接进入该容器的时候,使用exit退出的时候这个容器就会自动结束。
- 此时后台就没有该运行中的容器。
# -id 进入容器退出(前台容器自动结束【后台正常运行】)
2.如果使用 -id 后台运行容器的时候,使用 docker exec进入该容器,此时使用exit退出该容器的话,只是退出该容器,并没有从后台结束该容器,该容器还会在后台运行这。
4 停止与启动容器
- 停止正在运行的容器:docker stop $CONTAINER_NAME/ID
docker stop mycentos2
编辑
- 启动已运行过的容器:docker start $CONTAINER_NAME/ID
docker start mycentos2
编辑
3 文件拷贝
3.1 如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 宿主机文件 容器id:容器路径
docker cp /home/a.txt 427:/home
3.2 也可以将文件从容器内拷贝出来
docker cp 容器id:容器路径 宿主机路径(起别名)
docker cp 427:home/a.txt a.txt
编辑
解释:cp 当前目录下的a文件到 容器中的/usr/local/下的a文件
[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@32400e14bea6 /]# cd /usr/local/
[root@32400e14bea6 local]# ll
编辑
4 目录挂载(映射)
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器里所对应的目录。
4.1 创建容器 并挂载宿主机目录 到容器中的目录下
docker run -di --name=mycentos99 -v /宿主机要挂载目录:/容器要挂载路径 指定镜像
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
# -v : 映射
# 挂载作用:
1.一旦挂载,以后宿主机目录内修改,同样影响容器内部
2.容器内修改同样影响宿主机
如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数--privileged=true来解决挂载的目录没有权限的问题。
docker run -di --privileged=true -v /root/test:/usr/local/test --name=mycentos4 centos:7
编辑
5 查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据:
# 命令:
# 查看容器详细信息
- docker inspect 容器id
# 只查看容器ip地址
- docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/容器ID
docker inspect mycentos2
编辑
也可以直接执行下面的命令直接输出IP地址:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2
# 其实宿主机与容器之间是通过网关进行通信的
- 查看网关
# 容器内下载该命令:
- 下载查看ip信息的命令:yum install net-tools
- ifconfig:查看网络相关信息
编辑
# 所以此时我们在连接redis的时候就有两种方式
- 第一种:
- 因为我们做了端口映射,所以我们可以通过:云服务器地址:6377连接
- 第二种:
- 此时我们已经知道了容器的ip地址,所以就可以通过: 容器的ip地址:6379 (此时端口号就是它本身的6379因为是直接通过它本身的ip建立的连接)
# 每个容器都有ip地址,每一个ip地址标志着一台唯一服务器,所以就实现了宿主与容器之间的隔离性,每一个容器就相当于一个虚拟机
6 删除容器
- 删除指定的容器: 这个命令只能删除已经关闭的容器,不能删除正在运行的容器
docker rm $CONTAINER_ID/NAME
- 删除所有的容器:
docker rm `docker ps -a -q`
或者:
[root@localhost ~]# docker rm $(docker ps -aq)
1 MySQL部署
1.1拉取MySQL镜像
docker pull mysql
查看镜像:
编辑
1.2创建MySQL容器
docker run -di --name=pinyougou_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
# -e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
1.3 进入MySQL容器
- 进入容器中
docker exec -it pinyougou_mysql /bin/bash
- 登录mysql
mysql -u root -p
- 授权允许远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
1.4 远程登陆MySQL
- 在本机的电脑上去连接虚拟机Centos中的Docker容器,这里192.168.25.132是虚拟机操作系统的IP.
编辑
2 tomcat部署
2.1拉取tomcat镜像
docker pull tomcat:7-jre8
2.2创建tomcat容器
docker run -di --name=pinyougou_tomcat -p 9100:8080 tomcat:7-jre8
3 Nginx部署
3.1 拉取Nginx镜像
docker pull nginx
3.2 创建Nginx容器
docker run -di --name=pinyougou_nginx -p 80:80 nginx
3.3 测试Nginx
浏览器地址栏输入:http://192.168.25.132
4 Redis部署
4.1拉取Redis镜像
docker pull redis
4.2 创建Redis容器
docker run -di --name=pinyougou_redis -p 6379:6379 redis
4.3 客户端测试
本地安装一个redis的客户端 连接即可
1 备份与迁移
1.1 容器保存为镜像
docker commit pinyougou_nginx mynginx
# pinyougou_nginx是容器名称
# mynginx是新的镜像名称
# 此镜像的内容就是你当前容器的内容,接下来你可以用此镜像再次运行新的容器
1.2 镜像备份
docker save -o mynginx.tar mynginx
# -o 输出到的文件
# 执行后,运行ls命令即可看到打成的tar包.
1.3 镜像恢复与迁移
首先先删除掉mynginx镜像,然后执行命令进行恢复
docker load -i mynginx.tar
# -i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复
再创建容器。
2 dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数,其产出为一个新的可以用于创建容器的镜像.
7.1 dockerfile的demo
- 在root下创建demo目录
mkdir demo
cd demo
- 在demo 目录下创建 a文件
vim a
- 在某~/demo下创建Dockerfile文件
vim Dockerfile
内容为:
# my dockerfile ljh
FROM centos
MAINTAINER ljh
WORKDIR /root/workdir
RUN touch te
ADD a b
ENV key1 "hello"
# 语法解释:
# :代表注释
# FROM centos : 代表依据基本的镜像来创建
# MAINTAINER ljh :代表就是作者是谁
# WORKDIR /root/workdir :代表就是创建容器时进入工作的目录是容器中的/root/workdir目录
# RUN touch te :代表就是RUN 运行命令 运行一个创建空文件te
# COPY ["HI","."] :代表从宿主系统中复制HI 文件到容器系统中工作目录中的当前路径下
# ADD a b :代表从宿主机所在Dockerfile文件的目录下Copy 文件A 到容器中的b文件 b文件的目录为工作目录下。
# ENV key1 "hello" :定义linux中的环境变量。如下:
# 定义一个:key value
# 定义多个:key=value key2=value2
- 创建自定义镜像
docker biuld -t mycentos .
# docker build : 表示通过Dockerfile文件来创建镜像
# -t mycentos 表示 给与镜像的名称和版本 为:mycentos:lasted (lasted可以不写)
# . 表示从当前目录下进行加载Dockerfile文件
编辑
- 查看是否打包镜像成功
编辑
- 测试创建容器:
docker run -di --name=mycentosheh mycustomcentos
- 连接容器
[root@localhost demo]# docker exec -it mycentosheh /bin/bash
注意: 进入目录即为:/root/workdir
编辑
在目录下有 b文件和 te文件
编辑
输入:echo $key1 查看环境变量的值结果
编辑
3 springboot微服务部署
在微服的世界中,使用springboot来开发的微服务架构,使用dockerfile 来部署应用。
- 在本地开发完成微服系统 打包,将其copy到linux系统中
编辑
- 创建dockefile文件上图:
#my dockerfile ljh
FROM java:8
MAINTAINER ljh
ADD demo-0.0.1-SNAPSHOT.jar app.jar
# ENTRYPOINT ["java","-jar","/app.jar"] 表示 执行命令: 整个命令都只能有一个ENTRYPOINT
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080
java -jar app.jar
EXPOSE 8080 发布端口为:8080
- 构建镜像
docker build -t demoappimage .
- 创建容器
docker run -di --name=myapp1 -p 8080:8080
- 效果
编辑