基础Docker命令
Pull命令·获取镜像
pull命令用于拉取镜像资源,在Docker Hub上有许多人类高质量镜像等你下载,下面是关于如何获取这些镜像的一些说明
从Docker镜像仓库获取镜像的命令是docker pull。
命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
- Docker 镜像仓库地址:地址的格式一般是
<域名/IP>[:端口号]
。默认地址是 Docker Hub(docker.io
)。 - 仓库名:如之前所说,这里的仓库名是两段式名称,即
<用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为library
,也就是官方镜像。
Run命令·运行镜像/创建容器
有了镜像之后,我们就可以以这个镜像为基础启动并运行一个容器了。
例如启动一个乌班图系统
$ docker run -it --rm --name ubuntu:18.04 bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
-it
:这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。- –name 也可以给容器指定名字(–name=[容器名称])
ubuntu:18.04
:这是指用ubuntu:18.04
镜像为基础来启动容器。bash
:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是bash
。
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release
,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 18.04.1 LTS
系统。最后我们通过 exit
退出了这个容器。
列出镜像
想要列出已下载的镜像,我们可以使用docker imgaes或docker image ls命令
删除本地镜像
要删除本地的镜像,我们可以使用docker image rm命令
命令格式:
$ docker image rm [选项] <镜像1> [<镜像2> ...]
其中,<镜像>可以指镜像短ID、长ID、镜像名称或镜像摘要。
Docker换源
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"features": {
"buildkit": true
},
"experimental": false,
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "20GB"
}
}
}
操作容器
启动容器
启动容器有两种方式
一种是基于镜像新建一个容器并启动
另一种是将终止状态的容器重新启动
(PS:因为Docker容器十分地轻量,所以大多数情况下我们都是随时删除和创建容器的)
新建并启动一个容器
启动容器所需要的命令主要是docker run
例如新建一个Ubuntu系统,然后进入这个系统执行一些命令
docker run -it ubuntu
其中-i指的是让容器的标准输入输出(IO)保持打开状态
-t指的是让Docker分配一个伪终端并绑定到容器的标准输入输出上
两个合起来就是-it了
启动已终止的容器
启动容器属于对容器(Container)的操作,所以这一类命令一般是以docker container开头的
我们可以使用docker container start命令将一个已经终止的(exited)的容器启动
例如,这里我将一个已经关闭的Ubuntu容器启动起来
首先对于已经退出的容器,直接使用ls命令是不会显示的,所以需要在后面添加一个-a的参数
然后使用docker container start [ID]来启动容器
这里的ID可以只写前几个字符,只要能让Docker区分开其它容器就行
守护运行容器
在大多数情况下,我们只需要让Docker在后台运行即可,不需要它输出什么东西。
可以通过添加参数-d来实现上面的这个需求(这个d应该指的是daemon)
例如在后台启动一个tomcat
可以通过docker run -d tomcat来实现
终止容器
我们可以使用docker container stop来终止一个容器
例如我要终止刚才启动的tomcat
那么我只需要使用这个命令在加上容器id或id前几个字就行了
注:终止状态的容器需要使用docker container ls -a来查看
进入容器
有些时候,我们需要进入容器内部进行一些操作,一共有两种方法
attach命令
例如:我想要进入这个tomcat容器中
首先要知道这个容器的ID,并确保该容器是启动状态
之后使用docker attach命令进入该容器
可以看到,如果我按下Control+C键退出的话,该容器也会被关闭
exec命令(推荐)
和上面的使用方法差不多
docker exec [参数] [容器ID] [参数]
例如
可以看到退出后也容器也没有关闭,所以推荐这个方法。
删除容器
#删除容器的命令(remove container)
docker rm
#删除镜像的命令(remove container image)
docker rmi
Docker 容器的数据卷
数据卷的概念和作用
Docker容器删除后,容器中产生的数据就没了,所以如何让容器中的数据持久化呢?
Docker如何和外部机器如何交换文件?
Docker容器之间如何交换文件?
这里就要用到数据卷了(Volume)
数据卷
- 数据卷就是宿主机中的一个目录或一个文件
- 容器中的目录可以与数据卷目录同步,双方对目录的修改会立即同步
- 一个数据卷可以被多个容器同时挂载/绑定
配置数据卷
- 创建启动容器时,使用-v参数来设置数据卷
docker run ... -v 宿主机目录/文件:容器内目录/文件 ...
- 注意事项
- 目录必须为绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
示例:
宿主机中有一个/root/MyDocker文件夹,现在要把它绑定到Ubuntu容器中的/root/Data_sync目录中。
命令如下:
docker run -dit --name=d1 -v /root/MyDocker/:/root/Data_sync ubuntu
在容器和宿主机中对该目录下所有的文件操作都会被立即同步,容器删除不会导致宿主机中的文件丢失。
两个容器可以同时挂载同一个数据卷,这样可以实现容器之间的文件交换与同步。
数据卷容器
首先它是一个容器,然后它和数据卷有关,它可以实现并简化多容器对数据卷的挂载。
我们可以在创建容器时直接挂载指定数据卷,但如果有多个容器的话,操作和变更就不太方便了,这时就用到了数据卷容器了。
如图所示,如果我们有两个容器c1,c2想同时挂载一个数据卷,我们可以创建一个数据卷容器c3来实现这个需求。c1,c2同时挂载上c3后,就可以实现需求了。
经过上面的操作后,c1,c2实质上就等价于同时挂载上一个数据卷了,即使c3挂掉也不会影响c1和c2。
配置数据卷容器
- 创建c3数据卷容器,使用-v参数设置数据卷
docker run -it --name=c3 -v /root/MyDocker/Volume ubuntu bash
- 创建c1 c2容器,使用–volumes-from参数设置数据卷容器
docker run -it --name=c1 --volumes-from c3 ubuntu bash
docker run -it --name=c2 --volumes-from c3 ubuntu bash
Docker 应用部署案例
MySQL Docker部署
案例需求,在Docker中部署MySQL,能够通过外部访问MySQL Server
操作步骤
- 搜索MySQL镜像
- 拉取MySQL镜像
- 创建容器
- 操作容器中的MySQL
- 搜索MySQL镜像
docker search mysql
- 拉取MySQL镜像
docker pull mariadb
#MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB由MySQL的创始人Michael Widenius主导,由开源社区的大神们进行开发。性能吊打MySQL
- 创建容器
docker run -id \
-p 3307:3306 \
--name=m1 \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=helloworld \
mariadb
- -p 3307:3306:将容器的3306映射到宿主机的3307端口上
- -v $PWD/conf:/etc/mysql/conf.d:将宿主机当前目录下的conf挂载到容器上的/etc/mysql/conf.d
- -e MYSQL_ROOT_PASSWORD=helloworld:初始化root用户的密码
Tomcat Docker部署
拉取最新Tomcat
docker pull tomcat
部署命令
docker run -id --name=mytomcat \
-p 30002:8080 \
-v $PWD/webapps:/usr/local/tomcat/webapps \
tomcat
MongoDB部署
docker pull mongo:4.4
#这个兼容老设备
部署命令
docker run -d \
--name mongo \
-p 27017:27017 \
-v /usr/local/mongo:/data/db \
--restart always \
mongo:4.4
或部署最新版mongo/后面的那个config可以不用
docker run --name mongo --restart=always -p 27017:27017 -v /usr/local/mongo/db:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=yourpassword -d mongo --config /data/db/mongo.conf
Docker镜像原理
- Docker镜像的本质是一个分层文件系统
- Docker中Ubuntu的镜像比Ubunut操作系统镜像小的多的原因是:操作系统安装镜像中包含bootfs和rootfs,而Docker里的操作系统镜像只包含rootfs和少许其它镜像层。
- Docker中Tomcat有600多Mb,而Tomcat安装包只有不到100Mb的原因是:Docker中镜像是分层的,Tomcat安装包虽小,但它依赖于许多父镜像如操作系统、JDK等,所以大小很大。
Docker如何制作镜像
容器转镜像
代码:
docker commit [容器ID] [镜像名称]:[版本号]