超详细docker基础教程(全)

soup_god 2024-08-12 12:07:02 阅读 64

文章目录

docker容器-基础篇1、docker容器的安装1.1 初始化安装1.2 启动docker

1.3 卸载docker命令

2 docker镜像加速2.1 配置阿里云

3、docker常用命令3.1 帮助启动类3.2 镜像命令3.3 容器命令1. 新建和启动容器实例2. 查看运行的docker实例3. 退出容器4. 启动已经停止运行的容器5. 重启、停止、强制停止容器、删除已停止的容器6. 启动守护式容器(后台服务器)7. 查看docker容器运行日志、运行的进程、内部细节8. 进入已经运行的容器 并以命令行交互9. 从容器内拷贝文件到主机上10. 导入和导出容器

3.4 常用命令大全

4、docker镜像4.1 对dorker中的ubuntu进行操作4.2 对安装好环境的容器进行提交4.3 将镜像推送到阿里云上4.3.1 基础操作4.3.2 将阿里云镜像拉取到本地

4.4 将docker镜像推送到私有库4.4.1 下载镜像Docker Registry4.4.2 运行私有库容器4.4.3 使用ubuntu 进行测试4.4.4 查看私服库上运行的实例4.4.5 修改镜像tag标签4.4.6 修改配置文件支持http4.4.7 pull到本地并运行

5、容器数据卷5.1 宿主vs容器之间映射添加容器卷5.2 读写规则映射添加说明5.3 卷的继承和共享

6、docker 常规安装简介6.1 总体步骤6.2 安装tomcat6.3 安装mysql6.3.1 简单操作6.3.2 远程链接mysql6.3.3 mysql实战板 操作

6.4 安装redis

docker容器-基础篇

1、docker容器的安装

1.1 初始化安装

安装docker容器需要先配置好一台centos虚拟机,并配置好网络连接,以及挂载完iso镜像文件。确保yum可以正常使用

<code>先安装必要的包

yum -y install gcc

yum -y install gcc-c++

yum install -y yum-utils

配置stable镜像仓库 并从国内下载

(阿里)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(官网)

yum-config-manager --add-repo https://download.docker.com/linux/linux/centos/docker-re.repo

配置完后可以使用yum install vim 测试一下yum是否还能正常使用,如不能,请检查当前网络环境,然后重新执行上一句命令。

更新yum软件包索引(可以跳过、缓存yum加快下载速度)

yum makecache fast

安装docker ce

yum -y install docker-ce docker-ce-cli containerd.io

如出现以下报错

请执行一下命令,将所需要的包重新安装好,然后再次安装docker

<code>wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

1.2 启动docker

配置安装完毕后 执行以下命令、如果没有出现任何提示则启动成功。

systemctl start docker

测试 docker是否 成功安装并配置

<code>docker version

运行docker 输出hello world

<code>docker run hello-world

出现以上信息 说明本地没有hello world 的镜像、需要从远程库拉取docker镜像、耐心等待一会 会自动拉取镜像、出现以下信息(超时 请重试)、

至此 docker 的安装已经全部完成了

1.3 卸载docker命令

如不想继续使用docker 可以使用卸载命令

<code>systemctl stop docker

yum remove docker-ce docker-ce-cli containerd.io

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

2 docker镜像加速

2.1 配置阿里云

注册一个阿里云的账号,在阿里云官网的控制台申请个人容器镜服务、并完成基础配置。

点击镜像加速器

根据官网提示的命令进行操作

<code>sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://o3pdhdyp.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

操作完成后 再次输入 docker run hello-world。如果能正常运行跳出hello,world 说明配置正确。至此个人账号下的阿里云镜像配置完成,从此下载速度可以变快。(没有加速会导致后续有些操作莫名其妙报错、超时、会很头疼)

3、docker常用命令

3.1 帮助启动类

启动docker:

systemctl start docker

停止docker:

systemctl stop docker

重启docker:

systemctl restart docker

查看docker状态:

systemctl status docker

开启启动:

systemctl enable docker

查看docker概要信息:

docker info

查看docker总体帮助文档:

docker --help

查看docker命令帮助文档:

docker 具体命令 --help

3.2 镜像命令

docker images

列出当前环境中所有的镜像

-a:列出本地所有的镜像(含历史)

-q:只显示镜像ID

docker search 某个xxx镜像名字

查找某个镜像 例如:docker search redis

加上 --limit : 只列出N个镜像 例如:docker search --limit 5 redis

docker pull 某个xxx镜像名字[:TAG]

没有TAG就是拉取最新版

例如 docker pull hello-world

docker pull redis:6.0.8

docker system df

查看镜像/容器/数据卷所占的空间

docker rmi -f 某个xxx镜像名字ID

删除单个 docker rmi -f 镜像ID

删除多个 docker rmi -f 镜像名1:TAG镜像2

删除全部 docker rmi -f $(docker images -qa)

3.3 容器命令

本次操作在docker环境下ubuntu中进行,请先执行

<code>docker pull ubuntu

1. 新建和启动容器实例

docker run [options] image [command] (arg)

options说明(常用):

–name= “容器新名字” 为容器指定一个名称-d 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)-i 以交互模式运行容器,通常与-t 同时使用-t 为容器重新分配一个伪输入终端,通常与-i 同时使用-P 随机端口映射,大写P-p 指定端口映射,小写p

docker run -it ubuntu /bin/bash

启动一个有交互命令的ubuntu系统

成功进入 Ubuntu 实例

参数说明:

i:交互式操作。

t:终端。

Ubuntu:ubuntu镜像。

bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是bin/bash。

要退出终端,直接输入exit:I

2. 查看运行的docker实例

另起一个终端,输入命令查看到当前正在运行的ubuntu实例

options说明(常用)

-a 列出当前所有正在运行的容器+历史上运行过的-l 显示最近创建的容器-n 显示最近n个创建的容器-q 静默模式,只显示容器编号

<code>docker ps

3. 退出容器

<code>run进去容器,exit退出,容器停止

exit

run进去容器,ctrl+p+q 退出,容器不停止

ctrl+p+q

4. 启动已经停止运行的容器

docker start 容器ID或者容器名

5. 重启、停止、强制停止容器、删除已停止的容器

重启容器

docker restart 容器ID或者容器名

停止容器

docker stop 容器ID或者容器名

强制停止容器

docker kill 容器ID或容器名

删除已经停止的容器

docker rm 容器ID或容器名

一次删除多个容器

docker rm -f $(docker ps -a -q)

docker ps -a -q | xargs docker rm

6. 启动守护式容器(后台服务器)

在大部分情况下,我们希望docker的服务是在后台默默运行的,我们可以通过-d指定容器的后台运行模式。

ps:docker 容器后台运行,必须有一个前台进程、容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail) 就是会自动退出的。

先启动前台进程

docker run -it redis:6.0.8 /bin/bash

然后使用 ctrl+p+q 退出

在后台启动docker容器 (通过docker images 查看容器名)

docker run -d redis:6.0.8

查看是存活 正常运行

docker ps

7. 查看docker容器运行日志、运行的进程、内部细节

查看容器运行日志

docker logs 容器id

查看容器运行的进程

docker top 容器id

查看内部细节

docker inspect 容器id

8. 进入已经运行的容器 并以命令行交互

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

区别:

attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。

exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。

docker exec -it 容器id bashShell

docker attach 容器id

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

为防止容器被误删 导致重要数据丢失,可以在宿主机上进行备份。

docker cp 容器id(通过docker ps查看) :路径

将ubunt容器中 tmp位置下的a.txt 拷贝到宿主机根目录下

docker cp d19aa2235b2b:/tmp/a.txt /

10. 导入和导出容器

docker 还可以将整个容器的内容导出和导入

将整个容器导出 到当前目录 命名为abcd.tar

<code>docker export d19aa2235b2b > abcd.tar

导入容器、首先假设我们不小心删除了原有的容器、但是有备份。

<code>删除容器

docker rm -f d19aa2235b2b

导入容器备份

cat 备份文件 | docker import - 镜像用户/镜像名:镜像版本号

cat abcd.tar | docker import - soup/ubuntu:3.7

3.4 常用命令大全

<code>attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像

build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像

commit    Create a new image from a container changes   # 提交当前容器为新的镜像

cp        Copy files/folders from the containers filesystem to the host path   #从容器中拷贝指定文件或者目录到宿主机中

create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器

diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化

events    Get real time events from the server          # 从 docker 服务获取容器实时事件

exec      Run a command in an existing container        # 在已存在的容器上运行命令

export    Stream the contents of a container as a tar archive   # 导出容器的内容流作为一个 tar 归档文件[对应 import ]

history   Show the history of an image                  # 展示一个镜像形成历史

images    List images                                   # 列出系统当前镜像

import    Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]

info      Display system-wide information               # 显示系统相关信息

inspect   Return low-level information on a container   # 查看容器详细信息

kill      Kill a running container                      # kill 指定 docker 容器

load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]

login     Register or Login to the docker registry server    # 注册或者登陆一个 docker 源服务器

logout    Log out from a Docker registry server          # 从当前 Docker registry 退出

logs      Fetch the logs of a container                 # 输出当前容器日志信息

port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口

pause     Pause all processes within a container        # 暂停容器

ps        List containers                               # 列出容器列表

pull      Pull an image or a repository from the docker registry server   # 从docker镜像源服务器拉取指定镜像或者库镜像

push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器

restart   Restart a running container                   # 重启运行的容器

rm        Remove one or more containers                 # 移除一个或者多个容器

rmi       Remove one or more images       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]

run       Run a command in a new container              # 创建一个新的容器并运行一个命令

save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]

search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像

start     Start a stopped containers                    # 启动容器

stop      Stop a running containers                     # 停止容器

tag       Tag an image into a repository                # 给源中镜像打标签

top       Lookup the running processes of a container   # 查看容器中运行的进程信息

unpause   Unpause a paused container                    # 取消暂停容器

version   Show the docker version information           # 查看 docker 版本号

wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值

4、docker镜像

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像。只有通过这个镜像文件才能生成Docker 容器实例

Docket镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFs。bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是导文件系统bootfs。这一层与我们典型的Liux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs(root file system),在bootfs:之上。包含的就是典型Linux系统中的/dev,proc,bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Jbuntu,Centos等等。

4.1 对dorker中的ubuntu进行操作

更新包管理工具

apt-get update

安装 gcc

apt-get install gcc

安装vim 测试是否可以正常安装

apt-get-y install vim

安装完成后执行 vim a.txt 如可以正常编辑 则安装成功

4.2 对安装好环境的容器进行提交

在刚才我们在Ubuntu中安装好了 vim工具 现在把他提交上去。使之成为一个新的镜像。

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

通过docker ps 查看当前所在运行的容器、查看他的id,执行推送提交命令

docker commit -m="vim cmd and ok" -a="soup" 9ff9b7d183d8 soup/myubuntu:1.1.1code>

可以看到安装过vim的docker 实例的大小提升到了338MB,说明版本提交成功

4.3 将镜像推送到阿里云上

4.3.1 基础操作

首页登录阿里云、找到容器镜像服务器、打开个人实例

然后创建一个命名空间、并把它变成公有状态。

然后点击镜像仓库、创建一个镜像仓库,设置刚刚创建的命名空间,随便取一个仓库名,将仓库类型设置为公开,选择创建本地仓库

点击当前仓库的管理功能,找到其中的将镜像推送到Registry

将命令依次输入终端、–username=输入自己的阿里云账号、通过docker images 查看images id

4.3.2 将阿里云镜像拉取到本地

首先 先删除我们的实例,通过docker images 获取镜像id,将该镜像删除(docker rmi -f 9ef602dd1762) 如果报错就先停止镜像实例(docker stop 5aeff1f97034)

然后从阿里云上拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/soup_god/myubuntu:[镜像版本号]

<code>docker pull registry.cn-hangzhou.aliyuncs.com/soup_god/myubuntu:1.1.2

通过docker images 可以发现拉取成功

4.4 将docker镜像推送到私有库

4.4.1 下载镜像Docker Registry

<code>docker pull registry

4.4.2 运行私有库容器

默认情况,仓库被创建在容器的/var/lib/registry 目录下,建议自行用容器卷映射,方便于宿主机联机。

<code>docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

4.4.3 使用ubuntu 进行测试

先进入ubuntu 容器实例 完成基础配置

<code>进入容器实例

docker run -it ubuntu /bin/bash

更新包管理工具

apt-get update

安装net-tools

apt-get install net-tools

退出容器实例

ctrl+q+p

提交容器实例 -m 添加的命令 -a 作者 实例id 版本名:版本号

docker commit -m="ifconfig cmd add" -a="soup" 207f4da97b70 soupubuntu:1.2.1code>

停止提交后的容器实例

docker stop 207f4da97b70

查看images镜像

docker images

启动提交的实例

docker run -it 0f552c94df53 /bin/bash

查看提交后的实例 命令是否成功移植

ifconfig

至此 基本的前提操作已经完成、接下来我们要将提交的镜像实例、移植到本地私服库

4.4.4 查看私服库上运行的实例

查看运行在私服库上的实例、发现是空的

curl -XGET http://localhost:5000/v2/_catalog

4.4.5 修改镜像tag标签

接下来将新镜像 soupubuntu 修改符合私服规范的Tag

<code>docker tag soupubuntu:1.2.1 localhost:5000/soupubuntu:1.2.1

4.4.6 修改配置文件支持http

别无脑照着复制,registry-mirrors 配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。2个配置中间有个逗号 ,别漏了,这个配置是json格式的。

vim命令新增如下红色内容:vim /etc/docker/daemon.json

<code>{

  "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],

  "insecure-registries": ["192.168.111.162:5000"]

}

上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启dockerspan

<code>重启docker服务

systemctl restart docker

查看docker 运行实例

docker ps

运行docker 实例

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

推送镜像到服务器

docker push localhost:5000/soupubuntu:1.2.1

再次查看私服库上有没有推送上的镜像

<code>curl -XGET http://localhost:5000/v2/_catalog

4.4.7 pull到本地并运行

先删除本地的镜像、看看能否从私服库上下载下来运行。

<code>docker rmi -f localhost:5000/soupubuntu:1.2.1

从私服库上下载实例 到本地

docker pull localhost:5000/soupubuntu:1.2.1

进入下载的容器实例、再次运行ifconfig 发现成功运行。至此完成了私服库的上传与下载。可以实现全小组共享。

5、容器数据卷

Docker挂载主机目录访问如果出现cannot open directory.:Permission denied

解决办法:在挂载目录后多加一个-privileged=true参数即可

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,

在SELinux!里面挂载目录被禁止掉了额,如果要开启,我们一般使用-privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即

使用该参数,containe内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供

一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

数据卷可以在容器之间共享或重用数据卷中的更改可以直接实时生效数据卷中的更改不会包含在镜像的更新中数据卷的生命周期一直持续到没有容器使用它为止

5.1 宿主vs容器之间映射添加容器卷

docker run-it-privileged=true-v /宿主机绝对路径目录:/容器内目录 镜像名

没有目录会自动创建

<code>进入容器实例并添加卷

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=soup1 ubuntu

进入后随意的创建一些文件,可以发现主机和docker容器已经同步。出现了相同的文件。

5.2 读写规则映射添加说明

docker run-it-privileged=true-v /宿主机绝对路径目录:/容器内目录:rw 镜像名

rw 可读可写、可以不添加这个配置、默认为rw (主机和容器同步)

ro 只读属性:

​ 容器实例内部被限制,只能读不能写(可以从主机传给容器)

​ docker run-it-privileged=true-v /宿主机绝对路径目录:/容器内目录:ro 镜像名

5.3 卷的继承和共享

容器2继承容器1的卷规则

docker run -it --privileged=true–volumes-from父类 --name u2 ubuntu

soup1 是父类容器卷 u2 则是我们想创建的子类容器、该容器将继承soup1中的所有内容

<code>docker run -it --privileged=true --volumes-from soup1 --name u1 ubuntu

6、docker 常规安装简介

6.1 总体步骤

搜索镜像 (docker search xx)拉取镜像 (docker pull xx)查看镜像 (docker images xx)启动镜像 (docker run -it -p 8080:8080 tomcat)停止容器 (docker stop xx)移除容器 (docker rmi -f xx)

6.2 安装tomcat

拉取tomcat 镜像

docker pull tomact

运行该容器至8080端口

docker run -d -p 8080:8080 --name t1 tomcat

访问首页 看看有没有成功 发现出现404页面

可能没有映射端口或者没有关闭防火墙 (很小可能)把webapps.dist 目录换成webapps (因为新版的tomcat换掉了访问的目录)

重新进入tomcat终端 以此来排查问题

<code>docker exec -it 07d56fc8f126 /bin/bash

进入目录

cd webapps

查看当前目录下文件 发现没有任何文件

ls -l

切换到上层目录

cd ../

删除目录 因为这个目录没有想要的文件

rm -r webapps

将有内容的文件改名为 webapps 让tomcat找到对应的文件

mv webapps.dist webapps

再次访问 发现可以正常访问

如果觉得修改最新版的太过于麻烦,那么可以放弃上面的操作,下载免修改版的

<code>docker pull billygoo/tomcat8-jdk8

docker run -d-p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

6.3 安装mysql

先拉取镜像 拉取一个5.7版本的mysql

docker pull mysql:5.7

6.3.1 简单操作

使用mysql 镜像 以3306端口打开 并配置mysql 的root密码为123456

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入mysql容器实例

docker exec -it 341f7322fd22 /bin/bash

运行mysql 输入密码后进入mysql操作端

mysql -u -root -p

之后可以进行一些基本的mysql命令操作、这里不作演示。 证明了读写操作在容器中的mysql依旧可以使用。

6.3.2 远程链接mysql

我的虚拟机是使用nat模式 参考下这篇文章 centos7 网络配置nat

在当前环境中查看本机ip (ens33网卡) (我的是192.168.2.102)

在主机上使用ping 命令可以ping通

记得关闭虚拟机上的防火墙

1、命令行界面输入命令“systemctl status firewalld.service”并按下回车键。

2、然后在下方可以查看得到“active(running)”,此时说明防火墙已经被打开了。

3、在命令行中输入systemctl stop firewalld.service命令,进行关闭防火墙。

4、然后再使用命令systemctl status firewalld.service,在下方出现disavtive(dead),这权样就说明防火墙已经关闭。

5、再在命令行中输入命令“systemctl disable firewalld.service”命令,即可永久关闭防火墙。

使用navicat 工具连接 虚拟机->centos7->docker容器->mysql,发现连接成功!!!

连接成功后、当我们插入中文数据的时候会出现报错(mysql 8已修复)。这是docker容器下mysql,我们没有对字符集编码进行修正。

6.3.3 mysql实战板 操作

通过之前的简单操作、我们可以成功的安装mysql,但是还是会出现很多的问题(中文乱码、数据备份、敏感数据据迁移等等问题) 所以我们需要挂载容器数据卷、避免误操作!

挂载容器数据卷

<code>docker run -d -p 3306:3306 --privileged=true -v /soup/mysql/log:/var/log/myql -v /soup/mysql/data:/var/lib/mysql -v /soup/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

解决中文乱码

cd /soup/mysql/conf/

vim my.cnf

cat my.cnf

<code>[client]

default_character_set=utf8

[mysqld]

collation_server = utf8_general_ci

character_set_server =utf8

在mysql中重新查看

SHOW VARIABLES LIKE 'character%';

至此解决了mysql中文乱码问题、并且删除当前实例也不会清空之前的数据、因为数据已经挂载

6.4 安装redis

拉取镜像

<code>docker pull redis:6.0.8

运行镜像、挂载容器数据卷

docker run -p 6379:6379 --name my_redis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

配置redis.conf 文件 参考此链接



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。