Docker基本指令操作

# Docker基本指令操作 [https://blog.csdn.net/Java_Mr_Jin/article/details/122392414](https://blog.csdn.net/Java_Mr_Jin/article/details/122392414) ------ Docker是一个虚拟化平台( 官网https://www.docker.com/)可以通过虚拟化方式,为应用提供可运行的容器。基于这种方式,可更快地打包、测试以及部署应用程序。 Docker 核心对象 镜像(Image) Docker 镜像是一个特殊的文件系统(https://hub.docker.com/),镜像可以打包应用的运行环境以及应用程序,可以通过 Docker 启动这个镜像,进而将应用程序在一个容器中启动运行起来。在 Docker 镜像中,操作系统是高度精简的,镜像中的操作系统还不包含内核,容器都是共享所在的宿主机的内核。所以有时会说容器仅包含必要的操作系统(通常只有操作系统文件和文件系统对象),容器中查看到的 Linux 内核版本与宿主机一致。假如现在理解镜像有些抽象,可以暂时先将其理解为一个安装程序。 容器(Container) Docker容器可以将其理解为一个运行镜像的载体,镜像(Image)和容器(Container)的关系,就像是光盘和光驱。容器基于镜像创建、启动,然后运行镜像的中的文件。我们常常说使用镜像打包应用程序,使用 Docker 发布、部署应用程序,那么当你的应用成功在 Docker 上运行时,称这个应用就是容器化应用( containerized applications)。 Docker安装: 第一步:打开虚拟机 使用CentOS7964进行 第二步:将安装好的7964虚拟机进行克隆(更省空间) 第三步:在系统的桌面右键打开终端 通过ifconfig 查看网络 第四步:通过MobaXterm工具链接虚拟机系统,使用虚拟机显示的地址进行登录 安装Docker系统: 第一步:进行下载docker离线包 https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz 第二步:下载离线安装工具 https://github.com/Jrohy/docker-install/ 第三步:将下载好的资源进行解压 第四步:在linux环境下,创建root/setup/docker目录,然后拷贝下载好的资源到此目录(可通过MobaXterm工具直接上传到linux目录),例如 第五步:执行安装操作 # 进入/root/setup/docker 文件夹 cd /root/setup/docker # 为 install.sh添加执行权限 chmod +x install.sh # 安装 ./install.sh -f docker-20.10.6.tgz 成功后会出现下面信息: 进行检查安装状态: docker info 在线安装: 第一步:安装一组工具 sudo yum install -y yum-utils 第二步:设置 yum 仓库地址 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 第三步:更新yum缓存 sudo yum makecache fast #yum 是包管理器 sudo yum install -y docker-ce docker-ce-cli containerd.io #安装新版docker Docker服务基本操作指令: 启动docker systemctl start docker 查看docker状态 systemctl status docker 设置Docker开机自启 systemctl enable docker 禁用Docker开机自启 systemctl disable docker 重新启动Docker服务 systemctl restart docker 查看Docker信息 docker info 查看docker info中具体key的信息,例如: docker info | grep 'Docker Root Dir:' 停止docker服务 systemctl stop docker 开启Docker镜像加速 由于国内网络问题,需要配置加速器来加速。修改配置文件 /etc/docker/daemon.json 下面命令直接生成文件 daemon.json cat <<EOF > /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-size": "10m", "max-file": "3" }, "data-root": "/var/lib/docker" } EOF 说明:在执行如上指令时,保证你的登录用户为root管理员用户,并且设置好以后重启docker服务 下载镜像 语法:docker pull 镜像名 通过指令下载CentOS镜像 docker pull centos:7 说明,官方镜像仓库地址为https://hub.docker.com/ 浏览镜像 docker images 查看镜像详情 语法:docker inspect 镜像名或镜像id docker inspect centos:7 查看镜像历史 一个镜像是由多个层(layer)组成,可以通过docker history命令查看 docker history hello-world 导出镜像文件 导出镜像文件可下载到本地window中,导出后可以给他人使用 docker save hello-world | gzip > hello-world.tar.gz 删除镜像文件 语法:docker image rm 镜像名或镜像id docker image rm hello-world 导入镜像文件 基于镜像启动容器运行 docker run hello-world 创建并启动容器(Container) docker run -it centos:7 bash 查看Docker中的容器(Container) 查看运行中的容器 docker ps 查看所有容器 docker ps -a 查看容器日志信息 查看容器启动运行日志时,这个指令非常重要,假如容器没有启动,要通过此指令去看一下错误日志。 docker container logs 802 #802为自己的容器id(一般写前三位即可) 停止或重启容器 停止运行容器: docker container stop 802 #802为容器自己的id 重启容器: docker container restart 802 #802位容器自己的id 进入指定容器: docker exec -it 802 bash #802为容器id 注意:没有运行进不去容器 删除容器: docker container rm 802 #802为容器id 运行时删除需要添加 -f 强制删除 docker container rm -f 802 #802为容器iddock 清理所有处于终止状态容器,例如: docker container prune 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,默认会一直存在,即使容器被删除。 创建数据卷 docker volume create container-vol 查看所有数据卷 docker volume ls 查看指定数据卷 docker volume inspect container-vol 启动挂载数据卷的容器,例如: docker run -it --mount source=container-vol,target=/root centos:7 bash 或者使用简写: docker run -it -v container-vol:/root centos:7 bash 删除数据卷: docker volume rm container-vol 清理无主数据卷 docker volume prune 挂载主机目录: 我们还可以在启动容器时,以目录直接挂载的方式进行数据操作,例如: docker run -it -v /usr/app:/opt/app centos:7 bash 其中: 1)/usr/app:为宿主机目录 2)/opt/app: 为启动容器的一个目录 3)-v 用于指定挂载目录,如果本地目录(宿主机目录)不存在, Docker 会自动为你按照挂载目录进行目录的创建。 查看挂载目录信息: docker inspect 91a #91a 为容器id Dockerfile及镜像制作 我们从基于docker pull指令可以从远程仓库下载我们需要的一些镜像(image) Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。我们通常会基于此文件创建docker镜像 制作JDK镜像 centos:7镜像 (所有的镜像文件创建时都需要有一个空的centos镜像,就类似通过一个空的光盘或u盘创建一个系统启动盘是一样的) jdk压缩包 jdk-8u51-linux-x64.tar.gz(可以从课前资料获取),基于此压缩包,制作jdk镜像。 命令: tar -xvf jdk-8u51-linux-x64.tar.gz 解压即可 更改名字 创建Dockerfile文件 在创建新的镜像时都需要有一个Dockerfile文件(文件名一定要注意大小写),这个文件中定义镜像制作过程,这一小结以JDK镜像制作过程为例,讲解Dockerfile文件以及文件内容. 第一步:进入jdk-8u51-linux-x64.tar.gz文件所在目录,基于vim创建Dockerfile文件,例如 vim Dockerfile 说明,这里一定要注意文件的大小写. 第二步:按键盘上的"i"进入编辑模式 第三步:拷贝如下代码到你的Dockerfile中,例如: FROM centos:7 ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \ PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH CMD ['bash'] 第四步:拷贝完成,按ESC进入命令行模式(又叫最后一行模式) 第五步:然后按shift+冒号,输入wq保存退出.目录结构如下: 刷新配置才会生效:刷新环境变量 source /etc/profile 创建JDK镜像文件 在Dockerfile所在目录执行docker build指令.例如: docker build -t jdk:8 . #不要丢掉这里的点,-t表示镜像标识(镜像名),是tag单词的缩写. 运行JDK镜像文件: 在宿主机中执行如下指令,启动JDK容器,例如: docker run -it jdk:8 bash 进入容器以后,可以通过echo $PATH查看环境变量(注意单词大小写),并可以通过java –version查看JDK版本信息。 基于JDK镜像启动sentinel JDK镜像创建以后,如何通过此镜像运行一个web服务呢,例如sentinel等。 第一步:将sentinel拷贝宿主机指定目录,例如/root/servers目录(servers目录不存在可以自己创建)。 第二步:启动镜像容器,通过java执行运行web服务 基于jdk:8镜像启动运行sentinel服务(服务启动后可在宿主机通过localhost:8180进行访问) docker run -d -p 8180:8080 --name sentinel \ -v /root/servers:/usr/sca \ jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.1.jar 其中: -d 表示后台运行 -p 用于实现端口映射(假设外部要访问这个容器,必须要做端口映射) –name 表示为启动的容器起一个名字 这里,服务启动后可通过docker ps 指令查看启动的服务,假如看不到服务,可能服务启动失败,可通过如下指令查看具体日志: docker container logs 689 #这里689为容器id,也可以为你的容器名 在网页中进行测试:ip为远端宿主机的ip地址:端口号为宿主机的端口号 制作Sentinel镜像: 第一步:在sentinel所在目录创建Dockerfile文件,并添加如下内容 将jdk包也放置进去 FROM centos:7 ADD jdk-8u51-linux-x64.tar.gz /usr/local/ ADD sentinel-dashboard-1.8.1.jar /usr/local/ ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \ PATH=/usr/local/jdk1.8.0_51/bin:$PATH EXPOSE 8080 ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.1.jar"] 其中,EXPOSE表示对外暴露的服务端口,ENTRYPOINT中写的是你容器启动时候要执行的指令. 第二步:使用 Dockerfile 构建镜像(在Dockerfile所在目录执行docker指令) docker build -t sentinel:8 . #不要丢掉这里的点 第三步:后台运行sentinel容器 docker run -d --name sentinel8181 -p 8181:8080 sentinel:8 #-d 表示后台运行,-p用于指定端口映射,sentinel:8为镜像文件名 第四步:查看sentinel容器 docker ps 第五步:访问sentinel服务 可以在window中访问时你的linux系统中启动的sentinel服务,ip地址应该为宿主机的ip地址,端口号为宿主机的端口号.例如 安装MaSql数据库 有包的可以直接拖拽尽来 使用指令:添加到镜像 docker load < mysql.tar.gz 第一步:在hub.docker.com上搜索mysql镜像 第二步:拉取指定版本的mysql,也可以指定拉取版本,例如: docker pull mysql:8.0.23 第三步:检查mysql镜像 docker images 第四步:启动运行mysql镜像 (docker run 用于启动一个容器) sudo docker run -p 3306:3306 --name mysql \ -v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \ -v /usr/local/docker/mysql/conf:/etc/mysql \ -v /usr/local/docker/mysql/logs:/var/log/mysql \ -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:8.0.23 假如安装过程中失败了,则可通过docker ps -a 查看以前的容器,假如已存在,则通过docker rm 镜像id 删除再重新安装即可。 登录mysql服务 第一步:进入容器 (退出容器用exit) sudo docker exec -it mysql bash 第二步:登陆(默认密码root),一定要先进入mysql容器。 mysql -uroot -proot MYSQL设置密码 use mysql; update user set authentication_string='' where user='root'; FLUSH PRIVILEGES; ALTER user 'root' IDENTIFIED BY 'MyNewPass4!'; FLUSH PRIVILEGES; 停止和启动mysql服务 停止 docker stop mysql 启动 docker start mysql 假如希望查看mysql启动时的日志,可以执行 docker container logs mysql 这个指令。 设置mysql开机自启动(可选) docker update mysql --restart=always 安装Redis数据库 第一步:下载镜像文件 docker pull redis 第二步:准备配置文件 创建redis配置文件目录 mkdir -p /usr/local/docker/redis01/conf 在配置文件录下创建redis.conf配置文件(这个文件一定要创建,否在我们进行目录挂载时默认生成的是一个目录) touch /usr/local/docker/redis01/conf/redis.conf 第三步:创建redis实例并启动 sudo docker run -p 6379:6379 --name redis01 \ -v /usr/local/docker/redis01/data:/data \ -v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf 第四步:查看正在运行的程序 dicker ps 访问redis服务器 第一步:控制台直接连接redis测试 docker exec -it redis01 bash 第二步:检测redis 版本 redis-server -v 或者 redis-cli -v 第三步:登录redis(默认不需要密码) redis-cli 或者直接将上面的两个步骤合为一个步骤执行也可以,指令如下: docker exec -it redis01 redis-cli Redis设置密码 1.查看现有的redis密码:config get requirepass 2.设置redis密码config set requirepass ****(****为你要设置的密码) 3:密码认证 auth ****(****为你要设置的密码) 4.若出现(error) NOAUTH Authentication required.错误,则使用 auth 密码 来认证密码 停止和启动redis服务 停止 docker stop redis01 启动 docker start redis01 重启 docker restart redis01 安装Nginx代理 第一步:拉取nginx镜像 (从这里hub.docker.com去查找) docker pull nginx 第二步:查看 docker images 第三步:创建数据卷(这个对象会在宿主机直接创建一个目录) docker volume create nginx-vol 说明:查看数据卷对应的宿主机目录,可以通过如下指令: docker inspect nginx-vol 第四步:启动nginx服务 docker run --name nginx -p 80:80 -v nginx-vol:/etc/nginx -d nginx 其中:/etc/nginx 为nginx容器启动时,nginx镜像文件默认的解压目录 说明:假如以后想修改nginx配置,可以直接去nginx-vol数据卷对应的目录去修改. 访问nginx服务 进行访问检测,如图所示: 停止和nginx服务 停止: docker stop nginx 启动: docker start nginx 重启: docker restart nginx 安装Nacos组件 安装步骤 第一步:拉取nacos(hub.docker.com) docker pull nacos/nacos-server:1.4.1 第二步: mysql中执行nacos的sql脚本文件 1)将此文件nacos-mysql.sql(这个文件可从code服务器下载)拷贝到mysql容器的宿主机对应的挂载目录(可通过docker inspect mysql查看你mysql的挂载目录) 2)在linux环境下启动并登录mysql 进入mysql容器(前提是mysql已启动) docker exec -it mysql bash 登录mysql mysql -uroot -p 3)通过source指令运行容器目录下的sql文件 source /etc/mysql/nacos-mysql.sql #这里的/etc/mysql为容器中的一个目录(要选择你自己挂载的目录) 例如: 第三步:创建并启动nacos容器(拷贝下面内容时,账号和密码要用自己宿主机ip,自己数据库的账号密码) docker run \ -e TZ="Asia/Shanghai" \ -e MODE=standalone \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_DATABASE_NUM=1 \ -e MYSQL_SERVICE_HOST=192.168.139.128\ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=root \ -e MYSQL_SERVICE_DB_NAME=nacos_config \ -p 8848:8848 \ --name nacos \ --restart=always \ -d nacos/nacos-server:1.4.1 参数说明 单节点模式 MODE=standalone 数据库地址 MYSQL_SERVICE_HOST 数据库用户名 MYSQL_SERVICE_USER 数据库密码 MYSQL_SERVICE_PASSWORD 需连接的数据库名称 MYSQL_SERVICE_DB_NAME 端口映射 -p 8848:8848 任意时候重启容器,开机就能自动启动容器(需设置docker为开机自启) --restart=always 第四步:检查nacos服务 docker ps 假如启动失败,检查启动日志,例如: docker container logs nacos 其中,nacos的启动日志在/home/nacos/logs/start.out文件中。 访问nacos服务 启动nacos,然后在windows中输入http://ip:port/nacos方式进行访问测试 说明,nacos登录时,默认用户名和密码都是nacos. 容器互联 Docker 中存在多个容器时,容器与容器之间经常需要进行通讯,例如nacos访问mysql,redis集群中各个节点之间的通讯。 解决方案 Docker 中容器与容器之间进行通讯的解决方案一般有两种: 第一种:两个容器通过宿主机进行通讯(容器中的端口会映射到宿主机上) 第二种:两个容器之间直接通过虚拟网络进行连接,但是需要我们在docker中创建网络。 新建网络: 例如:创建名字为t-net的网络 docker network create -d bridge t-net #t-net为自己起的网络名称 其中,-d driver,网络类型,默认 bridge。 说明,创建好这个网络以后,在网落上添加容器,容器就可以通讯了 查看网络信息 列出所属有网络 docker network ls 查看网络信息 docker inspect 67d #67d 为创建的网络id 实现容器互联 创建容器 打开终端,基于centos:7这个镜像启动容器,并加入到t-net这个网络 docker run -it --name app1 --network t-net centos:7 新开终端执行,基于centos:7这个镜像再启动容器,同时也加入到t-net网络 docker run -it --name app2 --network t-net centos:7 测试网络互通 在两个终端中分别执行: ping app1 ping app2 显示如下: [root@35569c623c4c /]# ping app1 PING app1 (172.18.0.2) 56(84) bytes of data. 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms 64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms ...... ———————————————— 版权声明:本文为CSDN博主「辣椒太少不适合吃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Java_Mr_Jin/article/details/122392414