docker常用命令学习及遇到的问题

安装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回来)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值