Docker 基础篇

Docker 基础篇

镜像加速器配置

使用阿里云官网的容器镜像服务提供的镜像加速器提高docker下载速度。

修改/etc/docker/daemon.json来使用加速器。

帮助启动类命令

systemctl类似于任务管理器

systemctl start docker  	# 启动 docker 服务
systemctl status docker		# 查看 docker 服务的状态
systemctl stop docker 		# 停止 docker 
systemctl restart docker	# 重启 docker
systemctl enable docker		# 开机后自动启动 docker 服务
docker info					# 查看 docker 概括信息
docker --help				# 查看 docker 相关命令
docker 具体命令 --help		 # 查看具体命令用法

镜像命令

docker images -[aq]			   # 列出本地仓库镜像
	#-a	 列出本地所有镜像(包括历史映像层)
	#-q	 只显示镜像ID
docker search 镜像名称	 		# 查看远程仓库该镜像信息
docker pull 镜像名称[:版本号]	  # 从远程仓库拉去镜像
docker system df 			   # 查看镜像/容器/数据卷所占空间
docker rmi [-f] 镜像名称/ID		# 删除镜像
	# -f 强制删除
docker rmi -f $(docker images -qa)	# 删除所有镜像

容器命令

# 新建/启动容器
docker run [OPTIONS] IMAGE [COMMAND]
	OPTIONS说明:
		--name="容器名称"
		-d	后台运行容器并返回容器ID,即守护进程
		-i	以交互模式运行,通常与 -t 一起使用
		-t  为容器重新分配一个伪输入终端,通常与 -i 一起使用
		-p port(宿主机端口):port(容器端口)
		
# 列出容器
docker ps [OPTIONS]
	OPTIONS说明:
		-a  所有容器(包括运行的和停止的)
		-l	最近运行的容器
		-n cnt	最近运行的cnt个容器
		-q	只显示容器ID
		
# 退出容器
exit	# run 进去容器后,执行exit退出,容器停止
ctrl+p+q	# run 进去容器后,ctrl+p+q退出,容器不会停止

# 启动已停止的容器
docker start ID/NAME

#重启容器
docker restart ID/NAME

# 停止容器
docker stop ID/NAME

# 强制停止容器
docker kill ID/NAME

# 删除容器
docker rm [-f] ID

# 查看容器日志
docker logs ID

# 查看容器内运行的进程
docker top ID

# 查看容器内部细节
docker inspect ID

docker run -it 命令示例

docker run -it centos /bin/bash

-it启动交互模式,在进入交互模式后应有个交互式shell,其中 /bin/bash命令指定这个shellbash,输入exit退出终端并且容器停止,输入ctrl+p+q退出终端但容器不会停止

从容器拷贝文件到主机

docker cp ID:/tmp/a.txt /usr/data/b.txt

将容器内路径文件拷贝到宿主机对应路径

后台守护进程启动容器

在大部分场景下,我们希望 docker 服务以守护进程模式运行(比如 redis),可以通过 -d 指定后台运行。

进入前台交互容器

docker exec -it ID /bin/bash

docker attach ID

两者区别:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器停止,而exec在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。

推荐使用exec命令

docker run 与 docker run -d 区别

执行docker run redis后容器以前台模式运行,当前终端即为容器终端,一旦退出当前终端则redis容器停止运行,而执行redis run -d redisredis容器以后台守护模式运行,仍然可以以前台交互模式进入该容器,且退出终端后容器不会停止。

在一些情况下这两者并没有区别,比如运行ubuntu容器时就都是后台守护模式

导入/导出容器

导出容器

docker export ID > 文件名.tar

导入容器镜像

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

示例:

docker run exec -it ubuntu bash

docker export ID > abc.tar

cat abc.tar | docker import - horizon:1.0

至此本地镜像多了一个REPOSITORYhorizonTAG为1.0的ubuntu镜像

注意:启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错docker: Error response from daemon: No command specified.

docker 虚悬镜像

仓库名和标签都是<none>的镜像

镜像的分层概念

联合文件系统

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(类似Object),可以制作各种具体的应用镜像。

特性:一次用时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终文件系统会包含所有底层的文件和目录。

docker镜像实际上就是一层一层的文件系统组成,例如拉取tomcat镜像时可以看出它是有层次地下载。

镜像分层最大的一个好处就是共享资源,方便复制迁移,可以复用。

比如说多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

  • Docker 镜像层都是只读的,容器层是可写的

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下是镜像层“”

commit 镜像加强命令

普通的ubuntu容器是没有vim命令的,但可以通过提交容器副本使之成为一个新的镜像,在这个新的镜像中安装有vim命令。

格式:docker commit -m="描述信息" -a="作者" ID 镜像名:TAG

步骤如下:

  • 进入 ubuntu容器

  • apt-get update更新源

  • apt-get -y install vim安装vim

  • 退出容器,执行docker commit -m="add vim cmd" -a="horizon" 83f6a3466748 myubuntu:1.0

至此镜像仓库就多了一个装有vimmyubuntu镜像,也是由原本镜像加了一层形成的。

本地镜像发布到阿里云

首先在阿里云的容器镜像服务中创建命名空间,然后在该命名空间下创建镜像仓库,代码源选择本地仓库,然后根据页面提供的命令操作即可。

容器数据卷

卷就是目录或文件,存在与一个或多个容器中,由docker挂载到容器。将容器目录与主机目录做一个映射,完成数据持久化到本地机目录与备份。容器内文件的更改会立即映射到宿主机对应文件中,宿主机的更改也会同步到容器中。

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

注意:容器本身就类似于一个Linux,--privileged=true使容器拥有root权限,否则只有普通用户权限

实例

  • docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu bash创建容器

  • 在容器内执行cd /tmp/docker_datatouch dockerin.txt,此时在宿主机的/tmp/host_data下就存在dockerin.txt文件

  • 在宿主机中/tmp/host_data下执行echo 'hello docker' > a.txt,在容器映射目录下也存在a.txt文件

  • 通过docker inspect ID命令,在Mounts中可以看到容器的目录挂载情况

  • 在停止容器后,在宿主机的文件修改依旧可以同步到容器的对于挂载目录

限制容器挂载目录文件为只读

docker run ... /宿主机目录:/容器目录:ro ...

默认是rw权限

容器卷的继承

  • docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu bash创建宿主机和容器1之间的映射

  • docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu bash创建容器2,卷继承自容器1

  • 即使容器1挂了,容器2和宿主机的映射关机依旧存在

tomcat 使用

docker pull tomcat拉取镜像

docker run -d -p 8080:8080 tomcat运行容器

此时访问localhost:8080会出现404,这可能是防火墙没设置,另外就是因为新版tomcat容器内部的webapp文件夹为空,需要删除这个空文件夹然后将webapp.dist文件夹改名为webapp,这时就能正常访问

mysql 使用

docker pull mysql:5.7拉取镜像

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7运行容器,然后进入容器内部mysql -u root -p 123启动mysql即可正常使用

数据卷备份

docker run -d -p 3306:3306 --privileged=true \
-v /mysql/log:/var/log/mysql \
-v /mysql/data:/var/lib/mysql \
-v /mysql/conf:/etc/mysql/conf \
-e MYSQL_ROOT_PASSWORD=123 \
--name=mysql mysql:5.7

在容器被删除后,由于宿主机保留有对应的数据文件,所以重新执行以上命令,新的容器内依旧存在原来的数据

中文乱码问题

show variables like 'character%';可以看到编码是latin1

这时进入主机/mysql/conf目录下新建配置文件my.cnf,编辑如下:

[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8

然后docker restart mysql重启容器,进入查看发现编码为utf8

至此中文乱码解决

redis 使用

将正常的redis.conf文件复制到宿主机/redis下,将其中的daemonize yes注释掉或者改成no,否则会与docker run-d冲突,会导致容器一直启动失败。注释掉bind 127.0.0.1,运行redis外地连接。

docker run -d -p 6379:6379 --privileged=true  \
-v /usr/local/redis/etc/redis.conf:/etc/redis/redis.conf  \
-v /usr/local/redis/data:/data  \
redis:6.0.8 redis-server /etc/redis/redis.conf \
--requirepass "123"

使用指定的配置文件启动redis。注意使用配置文件启动要将配置文件中的 daemonize设为 no,否则无法启动。

posted @ 2022-01-22 21:04  のNice  阅读(49)  评论(0编辑  收藏  举报