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