发布于 

Docker学习笔记

一、Docker

Docker命令大全

(一)常用命令

新建容器

docker run -itd --privileged=true  --name <你的容器名字> -p 6000(你的电脑端口):6000(对应映射容器的端口)(可以进行多个端口映射) centos(用哪种镜像创建):7(镜像的Tag) /usr/sbin/init(表示使用bash进行命令操作)

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

docker run -itd --privileged=true --name my_centos7 -p 50001:22 -p 50002:3306 centos:7 /usr/sbin/init

关于docker镜像内安装命令

apt-get update && apt-get install lrzsz
yum -y(安装时自动选择yes) update

查看容器状态

docker ps -a

暂停容器

docker stop <容器ID>

运行容器(stop的容器再次启动)

docker start <容器ID>

查看本地镜像

docker images

拉取镜像

docker pull +镜像名称

连接运行的容器

docker attach +容器

可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)

使用 Ctrl + p + q 退出,直接使用Ctrl + c会导致容器本身也停止

查看容器运行的进程

  • 得到PID后,在宿主机上执行操作
docker top +容器名称

在容器中执行命令

docker exec -it <容器ID>  /bin/bash

从容器创建一个新的镜像

docker commit -a "作者名称" -m "携带消息" <容器名> centos(镜像):ssh(标签)
eg:docker commit -a "Gendml" -m "已配置ssh的CentOS7镜像" Gendml_Centos7 centos:ssh

容器与主机之间的数据拷贝

docker cp /www/runoob 96f7f14e99ab:/www
docker cp  96f7f14e99ab:/www /tmp/

容器与宿主映射添加容器卷

docker run -itd --privileged=true --name 容器名称 -v /宿主机绝对路径目录:/容器内目录 -p 端口映射 镜像名
  • 配置读写规则
  • 默认是读写
  • 配置只读规则:docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录:ro 镜像名

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

  • 效果:容器之间卷数据映射,无论容器是否运行,实时卷同步
docker run-it --privileged=true --volumes-from 父类 --name u2 ubuntu

Docker导出容器作为tar归档文件

docker export -o xxx.tar <容器名称> bash(不加会出bug)

Docker从归档文件中导入镜像

docker import  xxx.tar 镜像名称:标签

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

  • 解决办法:在挂载目录后多加一个–privileged=true参数即可
  • 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为
  • 在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

Docker网络

  • Docker网络作用:
  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

网络模式

  • bridge模式:使用–network bridge指定,默认使用docker0

    Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

  • host模式:使用–network host指定(-p端口映射失效,开启后要关闭虚拟机的防火墙)

    直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

  • none模式:使用–network none指定

    在none模式下,并不为Docker容器进行任何网络配置。

    也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo

    需要我们自己为Docker容器添加网卡、配置IP等。

  • container模式:使用–network container:NAME或者容器ID(多个容器间通信)

    新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

    docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
    docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

自定义网络

  • Docker的–link参数已经过时,即将被Docker弃用
  • Docker容器之间可以通过ip地址ping通
  • 但是,一旦某个容器宕机,其他新建的容器会占用宕机容器的ip地址,原容器的功能会出现错乱,这对于大型微服务开发是致命的
  • 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通),容器名称可直接作ip地址使用。
docker network create XXX网络名字

安装ping命令

apt-get update
apt install -y iputils-ping

安装ip addr命令

apt-get update
apt install -y iproute2

安装ifconfig命令

apt-get update
apt install -y net-tools

查看网络

docker network ls

查看单个Docker容器网络地址

ip addr

查看网络源数据

docker network inspect  XXX网络名字

删除网络

docker network rm XXX网络名字

Docker配置Jetty容器

创建容器

docker run -itd --name gendml_jetty --privileged=true --network gendml_net -p 50001:8080 -v /usr/Docker/jetty/webapps:/var/lib/jetty/webapps jetty:9.4.48-jdk8

Docker配置Nginx容器

创建容器

docker run -itd --name gendml_nginx_student --privileged=true --network gendml_net -p 50004:9000 -v /usr/Docker/nginx_student/config/nginx.conf:/etc/nginx/nginx.conf -v /usr/Docker/nginx_student/html:/usr/share/nginx/html nginx:1.20.1

Docker配置JDK18容器

创建容器

docker run -itd --name gendml_java --privileged=true --network host -v /usr/Docker/java:/usr/java/project openjdk:jdk-oraclelinux8

查看防火墙状态

systemctl status firewalld

开机关闭防火墙

systemctl disable firewalld.service

关闭防火墙

systemctl stop firewalld.service

Docker配置MySQL容器

创建容器

docker run # 创建容器
-itd # 交互式后台运行 
--name gendml_mysql # 容器名称
--privileged=true # 特权模式,root
--network gendml_net # 选择自定义网络
-p 50002:3306 # 端口映射(宿主:容器)
-e MYSQL_ROOT_PASSWORD=dml666 # MySQL密码
-v /usr/Docker/mysql/log:/var/log/mysql # 资源共享
-v /usr/Docker/mysql/data:/cvar/lib/mysql # 资源共享
-v /usr/Docker/mysql/conf:/etc/mysql/conf.d # 资源共享
mysql:5.6.51 # 使用对应镜像创建容器

docker run -itd --name gendml_mysql --privileged=true --network gendml_net -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dml666 -v /usr/Docker/mysql/log:/var/log/mysql -v /usr/Docker/mysql/data:/cvar/lib/mysql -v /usr/Docker/mysql/conf:/etc/mysql/conf.d mysql:5.6.51

解决中文乱码

cd /usr/Docker/mysql/conf
# 在conf文件夹内创建my.cnf
# 文件填入如下内容
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

docker restart gendml_mysql

Docker配置Redis

docker run -itd  --privileged=true --name gendml_redis --network gendml_net -p 50003:6379 -v /usr/Docker/redis/redis.conf:/etc/redis/redis.conf -v /usr/Docker/redis/data:/data redis:6.0.8 redis-server /etc/redis/redis.conf

Docker配置Jupyter-lab

docker run -itd  --name gendml-jupyter  --privileged=true --network host -v /usr/Docker/jupyter:/home/jovyan jupyter/base-notebook