安装docker参考:
centos7安装docker_sumengnan的博客-CSDN博客
docker常用命令
1、查看已安装的docker镜像:docker images
2、查看正在运行的docker镜像:docker ps
3、搜索可以安装的docker镜像:docker search mysql(例如mysql)
4、查看可以安装镜像版本:去https://hub.docker.com/search?q=&type=image上查询
5、安装官方最新镜像:docker pull mysql:版本号(例如mysql)也可以不带版本号,默认是latest
6、运行容器操作:docker run -itd --name mysql-sumengnan -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
参数:-e表示环境变量
-v $PWD/webapps:/usr/local/tomcat/webapps(把文件目录映射到宿主机目录)
-p:宿主机端口:容器端口
--name:容器名字
运行容器并执行命令:后面加 /bin/sh -c "while true;do echo hello docker;sleep 1;done"
7、停止容器操作:docker stop 容器名字
8、删除容器:docker rm 容器名字
9、进入容器操作:docker exec -it 容器名字 /bin/bash
10、查看容器日志:docker logs 容器名字
11、查看容器中进程信息:docker top 容器名字
12、复制宿主机中的文件到容器:docker cp /root java:/root(复制宿主机root目录到docker容器java根下,并重命名为root。调换一下位置就是反向复制。源位置:目的位置)
13、导入本地镜像:cat sumengnan-3.2.6.tar.gz | docker import - sumengnan:3.2.6(镜像名自己定义)注意:镜像文件必须是tar.gz类型的文件。
14、保存镜像到本地:docker save -o sumengnan.tar(保存的文件名) sumengnan(镜像名)
导出并压缩:docker save apache/flink:1.16.3 | gzip > flink1.16.3.tar.gz
15、载入镜像(再次导入镜像)docker load --input sumengnan.tar 或 docker load < sumengnan.tar
解压并载入镜像:gunzip -c nginx.tar.gz | docker load
16、删除镜像:docker rmi -f image_id(镜像id,强制删除镜像)
17、删除none镜像:docker images|grep none|awk '{print $3 }'|xargs docker rmi -f
18、列出所有容器(运行和非运行的):docker container ls -a
19、删除容器:docker container rm c7a0bd002080(容器id)
20、启动临时容器并进入文件系统:docker run --rm -it --entrypoint /bin/bash my_image
21、不运行容器,从容器复制文件到宿主机:
创建容器:
docker container create --name test01 nginx:1.13.5
复制文件:docker container cp test01:/etc/nginx/nginx.conf .
22、不进入容器,在容器内执行命令:docker exec -it zookeeper3 zkServer.sh status
23、修改TAG名 :docker tag wurstmeister/kafka:latest wurstmeister/kafka:2.13_2.8.1
Dockerfile(构建镜像)
1、FROM openjdk:8-jre(基于哪个镜像)
2、COPY license.ckl /root(复制文件,复制宿主机文件到docker镜像中,可以使用通配符,如:?,*)
3、ADD license.ckl /root(复制文件:复制宿主机文件到docker镜像中,如果是压缩文件tar或其他,ADD命令会自动解压)
4、ADD /root/ /root(复制目录:复制宿主机目录到docker镜像中,把宿主机root文件夹下的内容,复制到docker的root文件夹下)
5、ENV java_version 1.8(定义环境变量,java_version=1.8,后续的指令中可以使用$java_version来引用)
6、VOLUME /tmp(挂载匿名卷到/tmp,后续可以通过docker run -v修改)
7、EXPOSE 8080(声明端口)
8、RUN apk update(在build构建过程中,要运行的命令,如更新apk包,安装某些服务等)
9、CMD java -jar /myjava.jar(镜像构建结束后要运行的程序,可以被docker run中指定要运行的程序覆盖)
构建镜像命令:docker build -t java:test .(如要构建一个叫java:test的镜像,后面有个点,指的是上下文,不能缺少)
构建镜像时不想使用缓存添加 --no-cache 参数。
遇到的问题:
pull时提示repository xxxx not found: does not exist or no pull access
原因:没有登录,需要先去 https://hub.docker.com创建一个账户,之后执行docker login --username= --password= 登录
或者是使用search后pull的时候输入name拉取
一、问题:docker pull mysql:latest下载不下来提示Pulling fs layer
导致此问题产生,主要是因为国家把docker国外镜像hub封掉了,导致镜像pull不下来,为此,改用国内的镜像
1、执行vim /etc/docker/daemon.json 编辑文件,修改成如下内容:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
二、如何开启2375端口,提供外部访问docker?
1、修改服务文件
vim /usr/lib/systemd/system/docker.service
把文件行中修改成如下内容:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
2、重新加载docker配置
systemctl daemon-reload // 1,加载docker守护线程
systemctl restart docker // 2,重启docker
注意:生产环境禁止使用远程访问docker,容易被黑。
如非要使用则需要增加ca证书认证:参考:https://docs.docker.com/engine/security/https/,
//1、生成ca证书(如果有ssl证书,省略此步骤)
openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096
openssl req -new -x509 -passin pass:123456 -days 365 -key ca-key.pem -sha256 -subj "/CN=sumengnan.com" -out ca.pem
//2、生成服务端证书
openssl genrsa -out server-key.pem 4096
openssl req -passin pass:123456 -subj "/CN=sumengnan.com" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:sumengnan.com,IP:0.0.0.0 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -passin pass:123456 -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
//3、生成客户端证书
openssl genrsa -out key.pem 4096
openssl req -passin pass:123456 -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -passin pass:123456 -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
//4、清除中间证书文件
rm -f client.csr server.csr ca.srl ca-key.pem extfile.cnf extfile-client.cnf
chmod -v 0400 ca-key.pem key.pem server-key.pem
dockerd服务端vim /usr/lib/systemd/system/docker.service增加参数:
--tlsverify \
--tlscacert=ca.pem \
--tlscert=server-cert.pem \
--tlskey=server-key.pem \
docker客户端增加:
--tlsverify \
--tlscacert=ca.pem \
--tlscert=cert.pem \
--tlskey=key.pem \
不想增加ssl也可以增加防火墙设置,只允许自己的公网ip访问(不知道自己公网ip,可以访问:
http://icanhazip.com/),防火墙配置如下:
#防火墙允许固定ip进行2375端口连接
iptables -I INPUT -s 60.148.30.206 -p tcp --dport 2375 -j ACCEPT
#拒绝所有的ip进行2375接口连接
iptables -A INPUT -p tcp --dport 2375 -j REJECT
入侵过程:
1、黑客扫描到2375端口,使用docker -H tcp://baidu.com:2375连接。
2、使用docker run -v远程启动一个容器,并映射宿主机目录到虚拟机
3、使用docker exec -it 进入容器操作,并修改宿主机authorized_keys文件。
4、加入黑客的公钥,即可达到免密码登陆服务器的效果。
三、各个docker容器之间如何通信?
1、使用容器ip(各容器每次启动会有ip)
2、使用docker run --link mysql:db(mysql是容器名称,db是别名,通过容器名称(或别名)来访问,缺点是只能单向访问)
3、使用docker run --net=host(共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。)
4、使用网桥(推荐):
- 1、执行docker network create test-network创建网络
- 2、执行docker run -it --network test-network --network-alias db(启动时加入test-network网络,容器取别名为db)
四、docker中没有vi或vim编辑器,甚至也没有yum和rpm命令怎么办?
可以用apt-get,先更新apt-get update,在安装vim:apt-get install vim
五、如何查看docker容器中装载的文件对应宿主机的位置?
容器启动时会返回容器id
执行:docker inspect 容器id 找到Mounts一栏,Type为volume的一项,Source属性的值就是对应宿主机的位置
六、docker build后执行docker run提示Error response from daemon: No command specified.
需要在docker run -it 后加上imageid,如:docker run -t -i 87e5b6b3ccc1 /bin/bash
七、docker build构建中使用git clone项目提示RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno
需取消ssl验证,在Dockerfile中加入如下:
RUN git config --global user.name "zhangsan"
RUN git config --global user.email "123456789@qq.com"
RUN git config --global http.sslVerify "false"
八、docker中java项目容器和mysql服务容器可以ping通,用客户端Navicat也可以连接,但是项目就是连接不上mysql
后来发现,docker pull mysql时没有加版本号,就自动拉取了lastet最新版的mysql。
因为mysql版本太高,java项目的jdbc驱动无法连接高版本mysql,这就解释了为什么Navicat可以连接,java项目却不能连接的原因。
最终解决:改成低版本的mysql如:5.7
九、docker中mysql连接表名大小写敏感
在mysql配置文件my.cnf中添加lower_case_table_names=1(需要先安装vim编辑器或docker cp到宿主机修改完再cp回来)